Создание подключаемой инфраструктуры - Создание экземпляров подключаемых модулей и их инициализация

ОГЛАВЛЕНИЕ

 

Создание экземпляров подключаемых модулей и их инициализация

Итак, как на самом деле вы будете создавать экземпляр подключаемого модуля, приведенного в этой строке?
String ClassName = "Royo.Plugins.MyCustomPlugin, MyCustomPlugin"
IPlugin plugin = (IPlugin )Activator.CreateInstance(Type.GetType(ClassName));

Здесь происходит следующее: поскольку ваше приложение не делает прямых ссылок на сборку специального подключаемого модуля, вы используете класс System.Activator. Activator — это специальный класс, который может создавать экземпляры объекта, заданного с любым количеством определенных параметров. Он даже может создавать экземпляры объектов и возвращать их. Если вы когда-нибудь писали код в ASP или Microsoft® Visual Basic®, вы должны помнить функцию CreateObject(), которая использовалась для создания экземпляров и возвращения объектов на основании CLSID класса. Activator действует по той же схеме: использует различные аргументы и возвращает экземпляр System.Object.

В этом обращении к Activator вы передаете в качестве параметра Type, экземпляр которого хотите создать. Используйте метод Type.GetType() для возвращения экземпляра Type, который соответствует Type подключаемого модуля. Обратите внимание, что метод Type.GetType() в качестве параметра принимает именно ту строку, которая была помещена в тэг подключаемых модулей, которая описывает имя класса и сборку, в которой он находится.

Создав экземпляр подключаемого модуля, приведите его к интерфейсу IPlugin и поместите его в объект вашего подключаемого модуля. Здесь должен присутствовать блок Try-Catch, поскольку вы не можете быть уверенными, что описанный там подключаемый модуль существует на самом деле или действительно поддерживает необходимый вам интерфейс IPlugin.

Создав экземпляр подключаемого модуля, добавьте его в ArrayList подключаемых модулей вашего приложения и переходите к следующему XML-узлу.

Вот код приложения:
public object Create(object parent, object configContext, XmlNode section)
{
//Происходит от CollectionBase

PluginCollection plugins = new PluginCollection();
foreach(XmlNode node in section.ChildNodes)
{
try
{
//Используйте метод 'CreateInstance' класса Activator

//при попытке создать экземпляр подключаемого модуля,

//передавая в него имя типа, определенного в значении атрибута

object plugObject =
Activator.CreateInstance(Type.GetType(node.Attributes["type"].Value));

//Приведите это к интерфейсу IPlugin и добавьте в коллекцию

IPlugin plugin = (IPlugin)plugObject;
plugins.Add(plugin);
}
catch(Exception e)
{
//Регистрируйте все возникающие исключения,

//но продолжайте перебор в поисках подключаемых модулей

}
}
return plugins;
}