0

我正在研究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.
}

我确实看到了这个问题,但它似乎不适用于 MEF 2。现在各种事情都不同了,但似乎更加轻量/精简(如广告中所宣传的那样!)。

是否有可能实现我希望使用 MEF 2 做的事情?

4

1 回答 1

2

public Class Create() => new Class();不是代表。在 C# 6 中,这称为表达式体成员函数

以下 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();
于 2016-02-29T00:10:40.400 回答