C# MEF与抽象工厂
更新:我应该试着用DI容器来处理它,还是这里的抽象级别不对 我想使用MEF(.NET4.5)实现抽象工厂 这对我不起作用 组成保持不变。由于以下错误,更改被拒绝: 这篇作文只产生了一个作文错误。下面提供了根本原因。有关详细信息,请查看CompositionException.Errors属性 1) 未找到与约束匹配的导出: 合同名称Mef3.工厂 所需类型标识Mef3.工厂 导致:无法在部件“Mef3.Program”上设置导入“Mef3.Program.\u工厂(ContractName=“Mef3.factory”)” 元素:Mef3.Program.\u工厂(ContractName=“Mef3.factory”)--> Mef3.程序 在MEF中这样做对吗? 如何将id转发给Foo/Bar-ctors 守则:C# MEF与抽象工厂,c#,.net,dependency-injection,mef,.net-4.5,C#,.net,Dependency Injection,Mef,.net 4.5,更新:我应该试着用DI容器来处理它,还是这里的抽象级别不对 我想使用MEF(.NET4.5)实现抽象工厂 这对我不起作用 组成保持不变。由于以下错误,更改被拒绝: 这篇作文只产生了一个作文错误。下面提供了根本原因。有关详细信息,请查看CompositionException.Errors属性 1) 未找到与约束匹配的导出: 合同名称Mef3.工厂 所需类型标识Mef3.工厂 导致:无法在部件“Mef3.Program”上设置导入“Mef3.Program.\u工厂(ContractName=“M
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
{
}
类程序
{
静态void Main(字符串[]参数)
{
var program=新程序();
program.Run();
}
只读合成容器_容器;
公共计划()
{
var catalog=新的AssemblyCatalog(Assembly.getExecutionGassembly());
_容器=新的合成容器(目录);
_容器。组件(本);
}
[进口]
公共工厂;;
公开募捐
{
var foo=_factory.GetInstance(“foo”,123);
Console.WriteLine(foo是foo);
}
}
[出口]
公营工厂
{
私人只读出口工厂(fooFactory);;
私人只读出口工厂(barFactory);;
[导入构造函数]
公共工厂(出口工厂食品工厂、出口工厂酒吧工厂)
{
_食品工厂=食品工厂;
_酒吧工厂=酒吧工厂;
}
公共基GetInstance(字符串名称,int-id)
{
交换机(名称)
{
案例“foo”:
返回_fooFactory.CreateExport().Value;
案例“酒吧”:
返回_barFactory.CreateExport()值;
}
抛出新ArgumentException();
}
}
公共类Foo:Base
{
[导入构造函数]
公共Foo([Import(“Id”)]int-Id)
{
}
}
公共类栏:基本
{
[导入构造函数]
公共栏([导入(“Id”)]int-Id)
{
}
}
[继承导出]
公共抽象类基
{
}
问题似乎是由您在Foo和Bar上的[Import(“Id”)]引起的。没有合同名称为“Id”的导出。MEF通常不允许您在运行时传递导入,您需要能够在合成时满足整个图形,否则它将无法工作。如果您想使用MEF来完成这个特定场景,您应该删除Foo和Bar上的ImportingConstructor,并在基类上添加一个SetId方法,并让您的工厂在调用GetInstance时调用它。谢谢。我删除了Foo/Bar参数。它抛出相同的异常。对id使用属性注入看起来很奇怪,因为它不是可选的。您认为这样的场景不适合DI模式吗?这是MEF唯一的问题吗?我应该使用其他DI容器,还是它只是DI的一个错误抽象级别?有人试过这个代码片段吗?我是唯一一个被它破例的人吗?