【问题标题】:Which one is a better approach for providing instances to plugins?哪一种是为插件提供实例的更好方法?
【发布时间】:2012-07-26 03:36:29
【问题描述】:

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

选项 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 类型参数的构造函数。它找到最佳匹配(具有最匹配参数的那个)并通过传递实例来调用它。

如果您要为此应用程序编写插件,您更喜欢哪种方法?

【问题讨论】:

    标签: c# plugins


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 2014-10-24
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多