更新:我应该尝试通过DI容器处理它还是这里的错误抽象级别?
我想使用MEF(.NET 4.5)实现抽象工厂。
这对我不起作用......
构图保持不变。由于以下错误,更改被拒绝:
该组合物产生单一组成错误。根本原因如下。查看CompositionException.Errors属性以获取更多详细信息。
1)没有找到符合约束的导出:
ContractName Mef3.Factory
RequiredTypeIdentity Mef3.Factory 导致:无法在部分'Mef3.Program'上设置导入'Mef3.Program._factory(ContractName =“Mef3.Factory”)'。
元素:Mef3.Program._factory(ContractName =“Mef3.Factory”) - > Mef3.Program
在MEF中进行此操作是否正确? 如何将id转发给Foo / Bar ctors?
代码:
class Program
{
static void Main(string[] args)
{
var program = new Program();
program.Run();
}
readonly CompositionContainer _container;
public Program()
{
var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
_container = new CompositionContainer(catalog);
_container.ComposeParts(this);
}
[Import]
public Factory _factory;
public void Run()
{
var foo = _factory.GetInstance("foo", 123);
Console.WriteLine(foo is Foo);
}
}
[Export]
public class Factory
{
private readonly ExportFactory<Foo> _fooFactory;
private readonly ExportFactory<Bar> _barFactory;
[ImportingConstructor]
public Factory(ExportFactory<Foo> fooFactory, ExportFactory<Bar> barFactory)
{
_fooFactory = fooFactory;
_barFactory = barFactory;
}
public Base GetInstance(string name, int id)
{
switch (name)
{
case "foo":
return _fooFactory.CreateExport().Value;
case "bar":
return _barFactory.CreateExport().Value;
}
throw new ArgumentException();
}
}
public class Foo : Base
{
[ImportingConstructor]
public Foo([Import("Id")] int id)
{
}
}
public class Bar : Base
{
[ImportingConstructor]
public Bar([Import("Id")] int id)
{
}
}
[InheritedExport]
public abstract class Base
{
}
答案 0 :(得分:1)
问题看起来是由您在Foo和Bar上的[导入(“Id”)]引起的。没有合同名称为“Id”的导出。 MEF通常不允许您在运行时传入导入,您需要能够在合成时满足整个图形,否则它将无法工作。如果你想使用MEF来完成这个特定场景,你应该删除Foo和Bar上的ImportingConstructor,并在Base类上添加一个SetId方法,让你的工厂在调用GetInstance时调用它。