http://msdn.microsoft.com/msdnmag/issues/03/10/Plug-Ins/default.aspx
Сам не так давно искал, и вот вышло от самой Microsoft. Неплохие примеры кода в отдельном файле. Первое впечатление — рекомендуют способ, использующийся в Janus...
С уважением,
Эдик
... << RSDN@Home 1.1 beta 2 >>
Здравствуйте, 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 >>
Здравствуйте, Edik, Вы писали:
E>http://msdn.microsoft.com/msdnmag/issues/03/10/Plug-Ins/default.aspx
ИМХО ничего "отличного" в ней нет. Так, неплохая статья и не более того...