【问题标题】:Plugin Architecture/Dependency Injection Question插件架构/依赖注入问题
【发布时间】:2009-07-02 06:14:37
【问题描述】:

我正在尝试找出插件的架构,但我从未使用过。本质上,我的程序支持多个数据库后端,但一次只支持一个。

我现在的想法是创建一个新的程序集(“.DataCore”),其中包含我所有的存储库接口(IFooRepository、IBarRepository)和一个 IDataPlugin 接口。然后,插件必须实现所有这些接口。

用户在 app.config 文件中指定所需程序集的名称。然后,我的程序将调用 DataCore 程序集中的一个函数,该函数又使用反射来加载所需的程序集。然后使用反射搜索实现 IDataPlugin 的类并调用 Initialize() 函数,该函数包含 Ninject 的所有 DI 绑定。

所以我的架构看起来像:

MyProgram => new DataCoreLoader(string assemblyName) => DesiredDataPlugin.Initialize()

我只是不确定这是否是正确的方法,以及我是否真的应该使用反射自己实现它。我猜有现有的框架?我简单地看了一下 MEF,但我不知道这是否有帮助?

我希望我的插件至少有一个可发现的类的原因是 a) 我想根据我的程序期望的值来检查 ProtocolVersion 编号,以检测过时的插件和 b) 我的配置工具应该提供所有的列表带有一些元数据的数据插件,如作者或描述。

永远不需要同时加载多个数据插件,但我正在寻找可以在其他领域实现这一点的东西(在应用程序的另一部分,我想使用订阅的插件我的应用程序发出的事件)。

【问题讨论】:

    标签: .net plugins dependency-injection


    【解决方案1】:

    这是实现插件的合理方式。

    【讨论】:

      【解决方案2】:

      如果您在 app.config 中指定所需的程序集,为什么不在此文件中指定完整的类名?所以不是

      <add key="dummy" value="DummyAssembly" />
      

      你可以写

      <add key="dummyPlugin" value="DummyNamespace.DummyClass, DummyAssembly" />
      

      然后您可以使用 Activator 类 (Activator.CreateInstane) 实例化您的插件

      Type DummyType = Type.GetType(DummyTypeValue);
      Activator.CreateInstance(DummyType);
      

      当你有你的类型时,你可以检查它的任何属性(作者、描述、版本等),或者实例化它并在使用前检查它的属性。

      【讨论】:

      • 谢谢。这当然是有道理的(我确实倾向于使用完整的强名称),但我仍然想扫描程序集以查找实现接口的类。这样,如果我有 3 个程序集,我可以在配置工具中添加一个选择,以允许用户选择他想要的一个。
      【解决方案3】:

      我同意这是一种实现插件的合理方式,尽管它可能会在一些方面进行改进。但是,我不确定您是否需要一种插件架构,因为 .NET 已经有了。看看 DbProviderFactory。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 2015-11-21
        • 1970-01-01
        • 2014-12-27
        • 2015-04-22
        • 2016-05-18
        • 1970-01-01
        相关资源
        最近更新 更多