.net core MEF 2 非共享创建政策

问题描述 投票:0回答:1

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

我们有几个类的创建政策是“NonShared”。我陷入了如何使用带有 .net core 的 MEF 2 应用以下属性的困境:

[PartCreationPolicy(CreationPolicy.NonShared)]

有谁知道将上述属性设置为“NonShared”的 .net core MEF 2 等效项是什么?

.net-core mef mef2
1个回答
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 { }

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

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);

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

为了强制共享,我们只需将

.Shared()
添加到方法链中
.Export<Monster>
之后,如下所示:

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

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

对于组合零件,你可以这样做:

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

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

    var terrorContainer = new TerrorContainer();
    container.SatisfyImports(terrorContainer);
© www.soinside.com 2019 - 2024. All rights reserved.