我有一个 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 对象。我添加了 ImportingConstructor 的属性如下MSDN 中的此页面 http://msdn.microsoft.com/en-us/library/ee155691.aspx,因为我在没有该属性的情况下遇到编译错误。
[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);
}
}
}
The ImportingConstructor
仅当构造函数的参数是 MEF 导出对象时,属性才起作用。这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
并用它来创建IPrimitiveDecomposer
根据具体实例int
values
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)