如何在MEF 2中导出工厂和/或其方法?

时间:2016-02-28 23:37:43

标签: c# .net mef object-composition mef2

我正在调查MEF 2(Microsoft.Composition),并希望将其与我现有的代码库集成。

我当前的代码库有一个带有简单签名的IFactory界面:

public interface IFactory<T>
{
    T Create();
}

我想注册我的工厂,这样如果我在工厂进行导出,它就会被注册为工厂Func<T>输出的T。所以像这样:

[Export]
public class Factory : IFactory<Class>
{
    public Class Create() => new Class();
}            

将使用以下代码返回新的Class实例和Create方法(作为Func<Class>委托)的引用:

using ( var container = new ContainerConfiguration()
    // ... magic missing here.
    .CreateContainer() )
{
    var instance = container.GetExport<Class>(); // instance is created from the Factory.Create above.
    var factory = container.GetExport<Func<Class>>(); // this is a reference to the Factory.Create delegate defined above.
}

我确实看到了this question,但它似乎并不适用于MEF 2.各种各样的东西现在都不一样了,但看起来更轻巧/简化(如宣传的那样!)。

是否有可能实现我对MEF 2的看法?

1 个答案:

答案 0 :(得分:2)

public Class Create() => new Class();不是代表。在C#6中,这被称为Expression-bodied member function

以下2个陈述在C#6中是等效的:

// Expression-bodied member function
public MyClass Create() => new MyClass();

// standard member function
public MyClass Create()
{
    return new MyClass();
}

至于解析IFactory<Class>然后使用工厂,只需使用要导出的类型装饰您的工厂并根据需要使用:

[Export( typeof( IFactory<MyClass> ) )]
public class Factory : IFactory<MyClass>
{
    public MyClass Create() => new MyClass();
}

在构建容器之后,解决方案就是:

var factory = container.GetExport<IFactory<MyClass>>();

MyClass mc = factory.Create();