Создание подключаемой инфраструктуры Страница 3. Создание экземпляров подключаемых модулей и их инициализация
|
Страница 3 из 4 Создание экземпляров подключаемых модулей и их инициализация Итак, как на самом деле вы будете создавать экземпляр подключаемого модуля, приведенного в этой строке? 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) { PluginCollection plugins = new PluginCollection(); foreach(XmlNode node in section.ChildNodes) { try { object plugObject = Activator.CreateInstance(Type.GetType(node.Attributes["type"].Value));
IPlugin plugin = (IPlugin)plugObject; plugins.Add(plugin); } catch(Exception e) { } } return plugins; } |