2016-02-28 33 views
0

我正在调查MEF 2(Microsoft.Composition),并希望将其与我现有的代码库相集成。如何在MEF 2中导出工厂和/或其方法?

我目前的代码库有一个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做的事情?

回答

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(); 
+0

你好@ Metro-Smurf谢谢你的回答。我意识到这个方法是你描述的而不是一个代表。我想从这个方法中创建一个委托,例如:'Func @delegate = new Func (factory.Create);'然后注册__that__作为导出。合理?我也意识到你的答案会让我直接导出一个'IFactory '。但是,这不是我正在寻找的。请参阅我的问题以查看我想要的确切出口。看:魔术。 :)如果我请求一个'Class'对象,我实际上在某处调用了'factory.Create'。再次感谢! –

+0

我可能误解了这个问题;对于那个很抱歉。我今天晚些时候可以仔细看看,但需要考虑几件事情:1.使用属性导出功能,该属性导出功能可以简单地导出属性返回的内容。 2.给出这样的解释:[用Mark Mmann解决MEF的封闭类型](http://blog.ploeh.dk/2011/03/14/ResolvingclosedtypeswithMEF/)再一次,我们对错误理解表示歉意。 –

+0

不用担心!我们都去过那里。 :)我确实知道Seemann先生的帖子,但如果可能的话,在这里寻找另一条路线。一些不需要我指定类型的东西。我只是想'[Export]'IFactory'和MEF“知道”如何调用它的'Create'方法并返回实例。在Unity中有一个'InjectionFactory',可以在注册类型时使用。我正在寻找与MEF 2相似的东西。挖掘之后,我确实[找到了这个](https://github.com/MefContrib/MefContrib/blob/master/src/MefContrib/Hosting/FactoryExportProvider.cs),但它是MEF 1。 –