Отличная вводная статья по плагинам в .NET
От: Edik Швейцария  
Дата: 07.11.03 22:21
Оценка: 14 (1)
http://msdn.microsoft.com/msdnmag/issues/03/10/Plug-Ins/default.aspx

Сам не так давно искал, и вот вышло от самой Microsoft. Неплохие примеры кода в отдельном файле. Первое впечатление — рекомендуют способ, использующийся в Janus...

С уважением,
Эдик
... << RSDN@Home 1.1 beta 2 >>
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 >>
Re: Отличная вводная статья по плагинам в .NET
От: Dr_Sh0ck Беларусь  
Дата: 10.11.03 07:36
Оценка:
Здравствуйте, Edik, Вы писали:

E>http://msdn.microsoft.com/msdnmag/issues/03/10/Plug-Ins/default.aspx


ИМХО ничего "отличного" в ней нет. Так, неплохая статья и не более того...
Do not fake yourself ;)
ICQ#: 198114726
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.