2009-08-04 52 views
0

我正在编写一个支持插件的应用程序。插件创建者负责为其创建的插件提供一些实例。提供这些实例有两种选择。哪一种更适合为插件提供实例?

选项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

我绝对更喜欢第二种选择,因为它更简单,更清晰。插件的单元测试也将更加清晰。

或者,如果您不想将所有INeedX传递给所有插件,请匹配构造函数参数的类型(明显使用反射)并仅传递构造函数中接受的参数。

相关问题