2016-02-28 29 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。 –