【问题标题】:MEF: "A Composable Part should contain at least one EXPORT"MEF:“可组合部件应至少包含一个导出”
【发布时间】:2011-07-13 14:19:49
【问题描述】:

来自官方MEF documentation

可组合部件应至少包含一个导出
可组合部件要么显式添加到容器中,要么通过使用目录创建。
MEF 随附的默认目录通过存在导出属性来识别可组合部件。

这是否意味着当使用默认目录时,此 sn-p 格式的相同文档将不起作用,因为它不导出任何东西?

class Program
{
  [Import]
  public IMessageSender MessageSender { get; set; }
}

我很难相信参与MEF 组合的所有班级都必须“将食物端上餐桌”,即使他们只是想“消费”。
上面的Program 是一个简单的例子:这个类没有任何东西可以添加到MEF 组合中。

其次,
如何将部件“显式地”添加到容器中
例如的文档CompositionContainer 对我没有任何帮助。

提前致谢 一月

【问题讨论】:

    标签: import export mef catalog


    【解决方案1】:

    可组合部件是可以导入到另一个部件中的部件。这里的例子:

    class Program
    {
        [Import]
        public IMessageSender MessageSender { get; set; }
    }
    

    Program 不是可组合的部分。它本身不会自动导入到另一部分。 IMessageSender 的导出是可组合的部分。

    您可以使用CompositionBatch 向容器显式添加部件,这允许您向容器显式添加ExportComposablePart 实例,或者通过扩展您可以添加原始值:

    var user = new User() { Name = "Matt" };
    var batch = new CompositionBatch();
    batch.AddExportedValue(user);
    
    CompositionContainer.Compose(batch);
    

    最终的调用是将您的部件添加到容器中。

    【讨论】:

      【解决方案2】:

      在您的示例中,程序必须调用container.SatisfyImports(); 才能检索IMessageSender

      此外,您可以在接口上使用继承导出,因此实现所述接口的所有内容都会自动导出。

      [InheritedExport]
      public interface IMessageSender
      {
      }
      

      在这里查看我的代码:MEFMVVMCS.zip

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 2022-01-13
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        相关资源
        最近更新 更多