【问题标题】:Why is MEF failing on the part constructor?为什么 MEF 在零件构造函数上失败?
【发布时间】:2016-07-14 17:16:21
【问题描述】:

我正在尝试使用 MEF 构建模块化应用程序。
但是,在编写时它似乎忽略了SetExportedValue(..., ...),导致它找不到我需要的值/对象。

这是我的(匿名和简化的)代码:

interface IPlugin {  }

class MyClass
{
    [ImportsMany(typeof(IPlugin))]
    public IEnumerable<Lazy<IPlugin>> Plugins;

    public LoadParts()
    {
        var ac = new AggregateCatalog();
        ac.Catalogs.Add(new AssemblyCatalog(typeof(PluginManager).Assembly));

        // imagine adding some DirectoryCatalogs here

        var cc = new CompositionContainer(ac);
        cc.ComposeExportedValue("MyValue", someinstance);
        cc.ComposeParts(this);
    }
}

[Export(typeof(IPlugin))]
class MyPart : IPlugin
{
    [ImportingConstructor]
    public MyPart([Import("MyValue")] sometype arg)
    { }
}

这会导致以下错误消息:

System.ComponentModel.Composition 警告:1:ComposablePartDefinition 'MyNamespace.MyPart' 已被拒绝。组成保持不变。由于以下错误,更改被拒绝: 合成产生了单个合成错误。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。

1) 未找到与约束匹配的导出:

ContractName  MyValue
RequiredTypeIdentity  somenamespace.sometype

导致:无法在部件“MyNamespace.MyPart”上设置导入“MyNamespace.MyPart..ctor (Parameter="...", ContractName="...")'。
元素:MyNamespace.MyPart..ctor (Parameter="...", ContractName="...") --> MyNamespace.MyPart --> DirectoryCatalog (Path="./")

我是否误解了部分构造函数的工作原理?
如何让它接受构造函数参数?


编辑澄清:someinstancesometype 的特定实例。我不想向容器添加类型,而是添加特定的类实例。

【问题讨论】:

    标签: c# .net constructor mef


    【解决方案1】:

    您的ImportingConstructor 也需要有效的合同,而不仅仅是价值观。

    这是一个示例,我的构造函数是如何工作的:

    [ImportingConstructor]
        public MyType([Import] IStatus status, [Import] IProtocoll protocoll) {
        }
    

    如您所见,您需要将接口用作构造函数参数。

    这些接口简单明了,没有任何必需的属性。

    IPotocoll 片段

    public interface IProtocoll {
    
        IProtocollStateController ProtocollController { get; set; }
    
        void WriteProtocoll(string action, string message, bool? result, Guid conditionId);
    
        void WriteProtocoll(Protocoll protocoll);
    
        List<Protocoll> GetAllProtocoll();
      }
    

    我建议您将MyValue 转为有效界面。这对于一个简单的字符串来说可能有点矫枉过正,但这就是 MEF 的工作原理。

    干杯

    【讨论】:

    • "MyValue" 包含一个特定的类实例。如果我只是 [Export] 那个类,它会在组合时生成一个我不想要的新实例,对吧?
    • 取决于你如何做。 This 是德语,但代码是英语并显示了它是如何完成的。您还可以将您的构造函数参数设为单例,这样您就没有更多实例了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多