【问题标题】:Best practices for implementing an addin/addon/plugin strategy实施插件/插件/插件策略的最佳实践
【发布时间】:2011-03-20 18:05:43
【问题描述】:

我的应用程序应该是可扩展的。为了我自己的需要,我实现了一些服务。这些服务基于 IoC/DI 原则。所以服务封装了应用的概念。

例如,有一个 IApplicationService。 ApplicationService 公开有关当前正在执行的应用程序的信息。指定了 AssemblyInfo 等。另一个示例是 INavigationService(请参阅示例中的 mef.codeplexcom)。该服务提供了一些属性,其中包含有关指定的当前选定项目的信息以及一些事件。

我认为,“服务方法”是最简单的,并且简化了应用程序的扩展点。所以,我不确定这真的是最好的方法。你怎么看?您将如何在诸如 addins/addons/plugins ... 之类的应用程序中实现“扩展点”?

提前感谢您的回复!对不起,我的英语很差。 ;)

【问题讨论】:

    标签: c# add-in extensible


    【解决方案1】:

    您熟悉MEF(托管可扩展性框架)吗?

    托管可扩展性框架(或简称 MEF)简化了可扩展应用程序的创建。 MEF 提供发现和组合功能,您可以利用这些功能来加载应用程序扩展。

    【讨论】:

      【解决方案2】:

      您非常需要了解 MEF - 托管可扩展性框架。

      这是一个很棒的新框架,Microsoft 自己正在使用它,例如Visual Studio 2010 的可扩展性故事。很棒且易于使用 - 当您可以使用成千上万的开发人员很快就会使用的东西时,为什么要重新发明轮子??

      【讨论】:

        【解决方案3】:

        是的,我熟悉 MEF。我也使用MEF的概念,但是有一些缺点。我的应用程序类似于 IoC/DI,与 MEF 一起使用有点复杂。 MEF 并不是真正的 DI 容器,因此将 MEF 与其他 DI 容器(例如 ninject、unity、...)一起使用很难实现这一点。我不会将 MEF 与其他 DI 容器一起使用。所以将 MEF 与其他 DI 容器混合并不是很好。

        希望你能理解我的担心。

        补充:无法将扩展加载到 MEF 中的 AppDomain。所以这对我的需要不好。 System.AddIn或者MAF都支持这个,不过我不会用System.AddIn,因为这个很重……

        【讨论】:

        • 如果您想添加信息,请通过编辑来更新您的原始帖子 - 不要添加您自己的答案 - 使其更难关注...
        • 是的,MEF 不是 DI 容器 - 因为它的工作不同于 DI 容器。但我不同意 - 混合 MEF 和 DI 容器(如 StructureMap 或 Unity)实际上并不难,而且可以做得很好。您可能需要更详细地解释为什么您认为这对 oyu 不起作用.....
        • 管理加载到 AppDomain 并非易事,我认为大多数 DI 框架也不会处理这个问题。您的所有服务都需要代理才能跨越 AppDomain 边界,这也意味着所有来回传递的类必须是 MarshalByRef 或 Serializable。您可能会考虑拥有一类“受信任”扩展程序(没有编组)和另一类“不受信任”扩展程序,它们只能访问有限数量的编组服务。
        • 附带说明,如果您显式注册代理实例以解析服务导入,则可以在 AppDomain 内使用 MEF(或 IoC 容器)。 MEF 通常通过属性配置,但可以显式添加导出。您基本上会为加载扩展的 AppDomain 提供一个单独的 CompositionContainer。
        猜你喜欢
        • 2012-05-23
        • 1970-01-01
        • 2010-10-04
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 2015-07-23
        • 1970-01-01
        相关资源
        最近更新 更多