pro*_*eek 5 c# constructor mef
我有一个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;}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我继承一个没有无参数构造函数的类时,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;}
}
Run Code Online (Sandbox Code Playgroud)
不起作用的代码如下.当您为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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在代码可以导入IPrimitiveDecomposerFactory并使用它来IPrimitiveDecomposer根据特定int值创建实例
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |