【问题标题】:How to import only types, not instances?如何只导入类型,而不是实例?
【发布时间】:2014-05-29 16:37:31
【问题描述】:

我正在导入通过使用带有[ImportMany(typeof(IPlugin))] 属性的MEF (System.ComponentModel.Composition) 导出IPlugin 类的DLL。

这是我用来获取扩展的代码:

AggregateCatalog catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog(AppDataHelper.ExeDir + "/Module/"));
CompositionContainer container = new CompositionContainer(catalog);
CompositionBatch batch = new CompositionBatch();
batch.AddPart(this);

但是,据我所知,相应的属性将在之后保存实例。

如何只导入扩展的类型(最好是 Type 对象),以便我可以创建自己喜欢的实例?

【问题讨论】:

    标签: c# .net list mef instantiation


    【解决方案1】:

    你不能,MEF 的工作原理是为它找到的每个兼容和导出类型创建一个实例。

    解决此问题的最简单方法是导入 工厂,然后使用它们创建实际实例。

    界面看起来像:

    interface IPluginFactory
    {
        IPlugin CreateInstance();
        string TypeName {get;}
    }
    

    然后您在 MEF 填充的工厂集合中搜索正确的类型名称并调用其 CreateInstance 函数。

    【讨论】:

    • 您能详细解释一下吗?
    • @Cobra_Fast 我放了一个示例工厂接口,这有意义吗?我很乐意根据需要提供尽可能多的详细信息(我已经这样做了 几次 次 :) 如果您需要更多信息,请告诉我!)
    • 所以我所做的只是导出一个工厂,然后我可以通过它实例化实际的扩展实例?
    • @Cobra_Fast,没错。我使用“TypeName”属性来查找它。它实际上不必是类型名称,它可以是您想要与该类/工厂关联的任何名称。
    【解决方案2】:

    生成一个目录,然后从那里工作(没有组合批次)并自己从那里找到相关类型。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 2017-05-16
      • 2020-02-18
      • 1970-01-01
      相关资源
      最近更新 更多