首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MEF与抽象工厂

MEF与抽象工厂
EN

Stack Overflow用户
提问于 2012-09-10 02:09:15
回答 1查看 810关注 0票数 5

更新:我应该尝试通过DI容器来处理它,还是这里的抽象级别是错误的?

我想使用MEF (.NET 4.5)实现抽象工厂。

对我来说不管用..。

组成保持不变。由于以下错误,这些更改被拒绝: 这篇作文产生了一个单一的作文错误。根本原因如下。查看CompositionException.Errors属性以获得更详细的信息。 1)没有发现与限制相匹配的出口: ContractName Mef3工厂 RequiredTypeIdentity Mef3.Factory导致:无法将导入'Mef3.Program._factory (ContractName=“Mef3.Factory”)设置为'Mef3.Program‘。 元素: Mef3.Program._factory (ContractName="Mef3.Factory") --> Mef3.Program

这是在MEF做这件事的正确方法吗?如何将id转发给Foo/Bar ctors?

守则:

代码语言:javascript
复制
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
{
}
EN

回答 1

Stack Overflow用户

发布于 2012-09-11 02:50:59

该问题似乎是由您在Foo和Bar上的导入(“Id”)引起的。没有合同名为"Id“的出口。MEF通常不允许您在运行时传递导入,您需要能够在组合时满足整个图,否则它将无法工作。如果您想使用MEF来完成这个特定的场景,您应该删除Foo和Bar上的ImportingConstructor,并在基类上添加一个SetId方法,并在调用GetInstance时让您的工厂调用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12344632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档