因爲只有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);
希望這有助於!