.net核心MEF 2非共享创作政策

Sco*_*are 1 mef mef2 .net-core

我正在切换到.net核心并尝试将我的旧框架MEF代码迁移到新的Microsoft Composition(MEF 2)(Microsoft.Composition 1.0.31).

我们有几个类,其创建策略是"NonShared".我对如何使用带有.net内核的MEF 2应用以下属性感到困惑:

[PartCreationPolicy(CreationPolicy.NonShared)]
Run Code Online (Sandbox Code Playgroud)

有谁知道.net核心MEF 2相当于将上述属性设置为'NonShared'?

taq*_*ion 5

由于只有MEF 2被移植到.NET Core,我们只能访问System.Composition中的类型,而不能访问System.ComponentModel.Composition中的类型.因此,无法像以前那样使用MEF 1设置该属性.

您可以为通过API定义的每个导出设置零件创建策略.

因为我们在万圣节附近,所以我们有这些课:

abstract class Monster { }

class It : Monster { }

class Zombie : Monster { }

class Wife : Monster { }
Run Code Online (Sandbox Code Playgroud)

在MEF 2中,您需要创建一个ConventionBuilder来阻止您的导出,如下所示:

var rules = new ConventionBuilder();
            rules.ForTypesDerivedFrom<Monster>()
                .Export<Monster>();
Run Code Online (Sandbox Code Playgroud)

这里有趣的部分是默认情况下强制执行非共享创建策略,因此不需要该属性.我们来测试一下:

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);
Run Code Online (Sandbox Code Playgroud)

现在,因为默认情况下我们不会在导出中强制共享,这将写入控制台False.

为了加强交流,我们只需添加.Shared()之后的方法链.出口是这样的:

rules.ForTypesDerivedFrom<Monster>()
                .Export<Monster>()
                .Shared();
Run Code Online (Sandbox Code Playgroud)

如果我们再次运行测试,我们将获得True,因为现在两个实例都指向相同的引用.

对于编写零件,您可以执行以下操作:

class TerrorContainer
    {
        [ImportMany]
        public IEnumerable<Monster> Monsters { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

无论你在哪里写作,你都会写:

    var terrorContainer = new TerrorContainer();
    container.SatisfyImports(terrorContainer);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!