.NET核心MEF 2非避免创建政策



我正在切换到.NET核心,并试图将我的旧版框架MEF代码迁移到新的Microsoft Coptions(MEF 2)(Microsoft.com.position 1.0.31)。

我们有几个类别的创建政策是"非避难所"。我将如何使用.NET核心使用MEF 2应用以下属性:

[PartCreationPolicy(CreationPolicy.NonShared)]

有人知道.NET Core MEF 2等效是将上述属性设置为"非索"?

由于仅将MEF 2移植到.NET核心,因此我们只能访问 System.composition.composition 中的类型,而不是 System.com.ponentModel中的类型。组成。因此,不可能将该属性设置为您过去使用MEF 1的方式。

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

由于我们在万圣节近,我们假设我们有这些课程:

abstract class Monster { }
class It : Monster { }
class Zombie : Monster { }
class Wife : Monster { }

在MEF 2中,您需要创建一个约定构建器才能定义您的出口,例如:

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

为了实施共享,我们只需在.Export<Monster>之后将.Shared()添加到方法链中:

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

,如果我们再次运行测试,我们将获得 true ,因为现在两个实例都指向相同的参考。

为了组合零件,您会做这样的事情:

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

,无论您在哪里撰写,都会写:

    var terrorContainer = new TerrorContainer();
    container.SatisfyImports(terrorContainer);

相关内容

  • 没有找到相关文章

最新更新