2017-10-04 53 views
0

我正在切換到.net核心,並嘗試將我的遺留框架MEF代碼遷移到新的Microsoft Composition (MEF 2)(Microsoft.Composition 1.0.31)。.net核心MEF 2非共享創建策略

我們有幾個類的創建策略是「NonShared」。我卡住我應該如何申請使用MEF 2與.NET的核心以下屬性:

[PartCreationPolicy(CreationPolicy.NonShared)] 

有誰知道.NET核心MEF 2當量是什麼設置上述屬性爲「非共享」?

回答

1

因爲只有MEF 2已經被移植到.NET的核心,我們只有System.Composition,而不是那些在System.ComponentModel.Composition內的存取權限類型。因此,不可能像過去一樣使用MEF 1來設置該屬性。

您可以爲通過API定義的每個導出設置零件創建策略。

由於我們的萬聖節臨近,讓我們supouse我們有這些類:

abstract class Monster { } 

class It : Monster { } 

class Zombie : Monster { } 

class Wife : Monster { } 

在MEF 2,你需要以創建一個ConventionBuilder到defeine您的產品出口,如:

var rules = new ConventionBuilder(); 
      rules.ForTypesDerivedFrom<Monster>() 
       .Export<Monster>(); 

這裏有趣的部分是默認情況下非共享創建策略是強制的,所以不需要該屬性。讓我們測試一下:

var config = new ContainerConfiguration() 
       .WithAssemblies(new[]{ typeof(Monster).GetTypeInfo().Assembly}, rules); 

var container = config.CreateContainer(); 
var monsterA = container.GetExports<Monster>().First(); 
var monsterB = container.GetExports<Monster>().First(); 
Console.WriteLine(monsterA == monsterB); 

現在,因爲默認情況下,我們不強制在我們的出口共享,這將寫入控制檯

爲了加強交流,我們只需添加.Shared()的方法鏈後。出口這樣的:

rules.ForTypesDerivedFrom<Monster>() 
       .Export<Monster>() 
       .Shared(); 

如果我們再次運行測試,我們會得到因爲現在兩個實例都指向相同的參考。

對於組成部件,你會做這樣的事情:

class TerrorContainer 
    { 
     [ImportMany] 
     public IEnumerable<Monster> Monsters { get; set; } 
    } 

而且無論你正在撰寫你可以這樣寫:

var terrorContainer = new TerrorContainer(); 
    container.SatisfyImports(terrorContainer); 

希望這有助於!