Re: Отличная вводная статья по плагинам в .NET
От: Фёдор  
Дата: 10.11.03 02:51
Оценка:
Здравствуйте, Edik, Вы писали:

Давно хотел поделиться мыслями на эту тему. Когда мне потребовалось я организовал это дело так.

Вся архитектура уложилась в пять классов. Главным является Station, он загружает конфигурацию компонентов(плагинов) + содержит статическое свойство Dispatcher, через которое компоненты могут получать ссылки на другие компоненты по строковому пути.

namespace Satellite
{

    /// Activate и другие обслуживающие объявлены как nonstatic.
    /// Вызов их может осуществляться только родившим классом.
    /// 
    /// Static члены будут доступны компонентам
    /// ...и вообще всем внутри AppDomain, по типу расшаренных.
    
    public class Station : MarshalByRefObject
    {
        private static Dispatcher _dispatcher;

        public static Dispatcher Dispatcher
        {
            get { return _dispatcher;}
        }

        public void Activate( string configFileName)
        {
            if( _dispatcher != null)
                throw new Exception( "Station уже активирована в этом AppDomain.");

            if( configFileName == null)
            {
                // Имя конфигурации по умолчанию.
                configFileName = AppDomain.CurrentDomain.BaseDirectory
                    + "Station.config";
            }

            _dispatcher = new Dispatcher();
            _dispatcher.LoadComponents( configFileName);
        }
            ...
    }
}



object obj = Station.Dispatcher["/Control/CommonActions/"];


При активации Station, т.е. когда Dispatcher вызывается в конструкторе загружаемого компонента, сначала подгружает "затребованный" у Dispatcher. Таким макаром решается вопрос очередности загрузки компонентов.

За информацию о загружаемом компоненте отвечает следующий класс:

namespace Satellite.Data
{
    public class ComponentInfo
    {
        [XmlAttribute( "assemblyfile")]
        public string AssemblyFile;

        [XmlAttribute( "typename")]
        public string TypeName;

        [XmlAttribute( "path")]
        public string Path;

        [XmlElement( "data")]
        public XmlDocument Data;

        public ComponentInfo()
        {}

        public ComponentInfo( object obj, string path)
        {
            this.AssemblyFile = obj.GetType().Assembly.CodeBase;
            this.TypeName = obj.GetType().FullName;
            this.Data = Serialize( obj);
            this.Path = path;
        }
        ...
    }
}


В настоящем, необходимые компоненту настройки хранятся тут же в поле Data. Это накладывает ограничение — компонент(плагин) должен быть XML-но сериализуемым. В будующем подумываю вынести настройки в какой-нить IStateProvider.

При использовании, можно "обернуть" Station в winservice или winapplication.
... << RSDN@Home 1.1.0 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.