Как заставить основной класс вызывать класс клиента? - PullRequest
2 голосов
/ 23 ноября 2011

Я пытаюсь создать основное приложение, которое использует плагины, чтобы ядро ​​никогда не менялось, и каждый раз, когда мы получаем нового клиента, мы пишем модуль для них.Мы реализуем интерфейс под названием IClientPlugin с новым классом клиентов.

Это использует Compact Framework 3.5 и Windows Mobile 6.5.3.

Итак, вот что мне нужно для достижения:

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

Основной модуль для этого запускается, когда человек нажимает на элемент меню получения.

основной метод - callClientMethod()

Я знаю имя клиента, оно сохраняется в глобальной переменной при входе в систему, и класс будет {clientname}.cs и будет содержать метод с именем processReceiving().

Я знаю, как создать экземпляр этого объекта.

Вопрос: есть ли способ, которым я могу динамически создать экземпляр класса клиента без жестких инструкций case?

Например, предположим, у меня есть 2клиенты Acme и Widgets.Каждый из них получает клиентский класс, а именно Acme.cs и Widgets.cs

Если я войду в систему как Acme или Widgets, я хочу, чтобы код динамически создавал экземпляр класса Client, в который я вошел, так, чтобы ядроКод не должен изменяться, так как я добавляю больше клиентов, пока я добавляю для них модуль.

Пример psuedo:

var myClient = New (Clientname)();

Возможно ли это или есть лучший подход к дизайну илиЯвляется ли оператор switch / case необходимым злом?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Вы можете использовать отражение для динамического создания объектов. Есть много способов загрузить тип или сборку. Начнем с простого:

Type clientType = Type.GetType("AssemblyName, TypeName");
IClientPlugin clientPlugin = 
                   (IClientPlugin)Activator.CreateInstance(clientType);    

Если ваш клиент имеет имя myClient1 и у вас есть соглашение, что ваши сборки называются, например, как Clients.ClientName.dll , вы можете написать функцию:

IClientPlugin CreatePluginInstance(string clientName) {
    string typeName = string.Format("Clients.{0}, {0}", clientName);
    Type clientType = Type.GetType(typeName);
    IClientPlugin clientPluginInstance = 
                      (IClientPlugin)Activator.CreateInstance(clientType);    
    return clientPluginInstance;
}

EDIT

Если ваши классы плагинов расположены в той же сборке, что и ваш основной проект, вы можете упростить вызов Type.GetType, чтобы просто указать имя класса:

Type.GetType(clientName);
0 голосов
/ 23 ноября 2011
var myClient = Activator.CreateComInstanceFrom("Acme.dll","Acme");

Где вы можете параметризовать имя сборки и имя типа.

...