.net 核心 MEF 2 非共享创建策略
.net core MEF 2 NonShared Creation Policy
我正在切换到 .net 核心并尝试将我的旧框架 MEF 代码迁移到新的 Microsoft Composition (MEF 2) (Microsoft.Composition 1.0.31)。
我们有几个 类 的创建策略是 "NonShared"。我对如何使用带有 .net 核心的 MEF 2 应用以下属性感到困惑:
[PartCreationPolicy(CreationPolicy.NonShared)]
有谁知道将上述属性设置为 'NonShared' 的 .net 核心 MEF 2 等效项是什么?
由于只有 MEF 2 被移植到 .NET Core,我们只能访问 System.Composition 中的类型,而不能访问 [=51 中的类型=]。因此,不可能像您以前对 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 之后的方法链中,如下所示:
rules.ForTypesDerivedFrom<Monster>()
.Export<Monster>()
.Shared();
如果我们再次 运行 测试,我们将得到 True,因为现在两个实例都指向同一个引用。
要组成部分,您可以这样做:
class TerrorContainer
{
[ImportMany]
public IEnumerable<Monster> Monsters { get; set; }
}
无论你在哪里作曲,你都会写:
var terrorContainer = new TerrorContainer();
container.SatisfyImports(terrorContainer);
希望对您有所帮助!
我正在切换到 .net 核心并尝试将我的旧框架 MEF 代码迁移到新的 Microsoft Composition (MEF 2) (Microsoft.Composition 1.0.31)。
我们有几个 类 的创建策略是 "NonShared"。我对如何使用带有 .net 核心的 MEF 2 应用以下属性感到困惑:
[PartCreationPolicy(CreationPolicy.NonShared)]
有谁知道将上述属性设置为 'NonShared' 的 .net 核心 MEF 2 等效项是什么?
由于只有 MEF 2 被移植到 .NET Core,我们只能访问 System.Composition 中的类型,而不能访问 [=51 中的类型=]。因此,不可能像您以前对 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 之后的方法链中,如下所示:
rules.ForTypesDerivedFrom<Monster>()
.Export<Monster>()
.Shared();
如果我们再次 运行 测试,我们将得到 True,因为现在两个实例都指向同一个引用。
要组成部分,您可以这样做:
class TerrorContainer
{
[ImportMany]
public IEnumerable<Monster> Monsters { get; set; }
}
无论你在哪里作曲,你都会写:
var terrorContainer = new TerrorContainer();
container.SatisfyImports(terrorContainer);
希望对您有所帮助!