2009-08-04 7 views
0

Я пишу приложение, которое поддерживает плагины. Создатель плагина отвечает за предоставление некоторых экземпляров плагинам, которые он создает. Существует два варианта предоставления этих экземпляров.Какой из них лучше подходит для предоставления экземпляров плагинам?

Вариант 1: Plugin писатель пишет свой плагины, как это:

public interface IGiveMe1 { INeed1 Need1 { set; } } 

public interface IGiveMe2 { INeed2 Need2 { set; } } 

public class MyPlugin : IGiveMe1, IGiveMe2 
{ 
    // This has to be parameterless 
    MyPlugin() { ... } 

    #region IGiveMe1 Members 

    public INeed1 Need1 { set { ... } } 

    #endregion 

    #region IGiveMe2 Members 

    public INeed2 Need2 { set { ... } } 

    #endregion 
} 

После плагина создателя создает экземпляр, используя обязательный конструктор без параметров, он ищет интерфейсы, что класс плагина реализует. Если плагин реализует IGiveMe1, разработчик подключений плагина устанавливает INTER1. То же самое для IGiveMe2.INeed2.

Вариант 2: Plugin писатель пишет свои плагины, как это:

public class MyPlugin 
{ 
    MyPlugin(INeed1 need1, INeed2 need2) 
    { 
     ... 
    } 
} 

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

Если вы хотите написать плагины для этого приложения, какой подход вы бы предпочли?

ответ

0

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

В качестве альтернативы, если вы не хотите передавать все INeedX ко всем плагинам, сопоставьте тип параметров конструктора (используя явно отражение) и передайте только те, которые приняты в конструкторе.

Смежные вопросы