因为只有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);
希望这有助于!