我正在切换到.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);