【问题标题】:C# .NET 4.0 Forms plugins managerC# .NET 4.0 表单插件管理器
【发布时间】:2011-01-29 11:23:19
【问题描述】:

我对 MEF、MAF、Unity 有点迷茫……

这个问题是关于 Winform 应用程序的架构的。

我有一个主项目,其中包含一个主窗体和一些其他窗体;

因为我想包含模块化,我正在考虑使用插件系统。

我想做的是在打开主应用程序时打开每个插件 Dll 以使用按钮、工具栏来引用每个插件...

然后我想处置它们,直到它们被调用。

但我不希望所有插件都保存在内存中......只是为了获得一个好的架构模型。

首先是关于 .NET 的: dotNet 是否仅保留对内存中 dll 插件的引用或所有插件代码

我正在考虑将 MEF 与 LAZY 导入集合一起使用,但我需要先实例化它们以获取我的按钮信息。那么第二个问题

如果我将导入集合设置为 null 并再次启动 compose() 函数,插件将被加载或等到调用加载(懒惰)?

【问题讨论】:

  • 您可以尝试重新表述您的问题吗?似乎有点困惑和笼统。
  • 更好吗?抱歉,真的无法理解

标签: c# .net add-in mef maf


【解决方案1】:

然后我想处理它们直到它们被调用。

您应该检查导入metadata,而不是检查导入的对象然后丢弃它们。您可以通过导入Lazy<IFoo,IFooMetadata>Lazy<IFoo,Dictionary<string,object>> 来获取此元数据。您可以使用 ExportMetadata 属性将此元数据添加到导出中。

首先关于 .NET:dotNet 是只保留对内存中 dll 插件的引用还是所有插件代码?

一旦程序集被加载,它就会保留在内存中,除非您卸载整个 AppDomain。

此外,.NET 4.0 中没有开箱即用的 ComposablePartCatalog 实现,可以在不加载相应程序集的情况下进行查询。但从理论上讲,如果您将元数据存储在程序集之外的某个位置,则可以完成类似的操作。在MEF code on codeplex 中有一个这样的实现示例。

我正在考虑将 MEF 与导入的 LAZY 集合一起使用

使用延迟导入不一定会阻止加载程序集。如果您有对 Lazy<IFoo> 对象的引用,则至少必须加载包含 IFoo 的程序集。正如我上面解释的那样,包含导出的 IFoo 实现的程序集也将在此时加载。

使用 Lazy 只会推迟一些构造函数的调用,希望能够更快地启动您的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多