2017-10-04 131 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); 

希望这有助于!