我正在编写一个支持插件的应用程序。插件创建者负责为其创建的插件提供一些实例。提供这些实例有两种选择。
选项1:插件编写器会像这样编写她的插件:
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,插件创建者会调用INeed1的setter。 IGiveMe2.INeed2也是如此。
选项2:插件编写器会像这样编写她的插件:
public class MyPlugin
{
MyPlugin(INeed1 need1, INeed2 need2)
{
...
}
}
在此方法中,插件创建者搜索带有类型为INeed1和INeed2的参数的构造函数。它找到最佳匹配(具有最匹配参数的匹配)并通过传递实例来调用它。
如果您要为此应用程序编写插件,您更喜欢哪种方法?
答案 0 :(得分:0)
我绝对更喜欢第二种选择,因为它更简单,更清晰。插件的单元测试也会更清晰。
或者,如果您不想将所有INeedX传递给所有插件,请匹配构造函数参数的类型(显然使用反射)并仅传递构造函数中接受的那些参数。