Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MEF与抽象工厂_C#_.net_Dependency Injection_Mef_.net 4.5 - Fatal编程技术网

C# MEF与抽象工厂

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

更新:我应该试着用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

守则:

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的一个错误抽象级别?有人试过这个代码片段吗?我是唯一一个被它破例的人吗?