C#/MEF没有';如果没有无参数构造函数,就不能处理基类

本文关键字:构造函数 参数 就不能 基类 处理 如果没有 MEF 没有 | 更新日期: 2023-09-27 18:21:36

我有一个Prim类,它为MEF实现了IPrimitiveDecomposer接口,并继承了Node基类。

public class Node
{
    public Node()
    {
    }
}
public interface IPrimitiveDecomposer
{
    bool Match(Node node);
}
[Export(typeof(IPrimitiveDecomposer))]
public class Prim : Node, IPrimitiveDecomposer
{       
    public bool Match(Node node) {return true;}
}

然而,当我继承一个没有无参数构造函数的类时,MEF的ComposeParts()方法无法导入Prim对象。我在MSDN的这个页面后面添加了ImportingConstructor的属性,因为我在没有该属性的情况下出现了编译错误。

[Export(typeof(IPrimitiveDecomposer))]
public class Prim : Node, IPrimitiveDecomposer
{
    [ImportingConstructor] 
    public Prim(int val) : base (val)
    {}
    public bool Match(Node node) {return true;}
}

不起作用的代码如下。当您为Node类提供无参数构造函数时,它就可以工作了。

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
public class Node
{
    public Node(int val)
    {
    }
}
public interface IPrimitiveDecomposer
{
    bool Match(Node node);
}
[Export(typeof(IPrimitiveDecomposer))]
public class Prim : Node, IPrimitiveDecomposer
{
    [ImportingConstructor] 
    public Prim(int val) : base (val)
    {}
    public bool Match(Node node) {return true;}
}
public class Test
{
    [ImportMany(typeof(IPrimitiveDecomposer), AllowRecomposition = true)]
    private IEnumerable<IPrimitiveDecomposer> PrimitiveDecomposers { get; set; }
    void mef()
    {
        // MEF
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);
    }
    static void Main()
    {
        var mef = new Test();
        mef.mef();
        var res = mef.PrimitiveDecomposers;
        foreach(var it in res)
        {
            Console.WriteLine(it);
        }
    }
}

C#/MEF没有';如果没有无参数构造函数,就不能处理基类

只有当构造函数的参数是MEF导出的对象时,ImportingConstructor属性才起作用。Prim(int val)构造函数组合失败,因为MEF不知道为构造函数提供什么值。

这种特殊的场景看起来更适合MEF工厂模式。

interface IPrimitiveDecomposerFactory {
  IPrimitiveDecomposer Create(int value);
}
[Export(typeof(IPrimitiveDecomposerFactory))]
sealed class PrimitiveDecomposerFactor : IPrimitiveDecomposerFactory {
  public IPrimitiveDecomposer Create(int value) {
    return new Prim(value);
  }
}

现在,代码可以导入IPrimitiveDecomposerFactory,并使用它基于特定的int

创建IPrimitiveDecomposer实例