我正在切换到.net核心,并试图将我的遗留框架MEF代码迁移到新的Microsoft组合(MEF 2) (Microsoft.Composition 1.0.31)。
我们有几个类,其创建策略是"NonShared“。在如何使用带有.net核心的MEF 2应用以下属性时,我陷入了困境:
[PartCreationPolicy(CreationPolicy.NonShared)]有人知道什么是.net核心mef2等效设置上述属性为“非共享”吗?
发布于 2017-10-16 18:13:18
由于只有mef2已经移植到System.Composition核心,所以我们只能访问System.ComponentModel.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之后的方法链中,如下所示:
rules.ForTypesDerivedFrom<Monster>()
.Export<Monster>()
.Shared();如果我们再次运行测试,我们将得到True,因为现在两个实例都指向相同的引用。
对于组成部件,您可以这样做:
class TerrorContainer
{
[ImportMany]
public IEnumerable<Monster> Monsters { get; set; }
}无论你在哪里作曲,你都会写:
var terrorContainer = new TerrorContainer();
container.SatisfyImports(terrorContainer);希望这能有所帮助!
https://stackoverflow.com/questions/46569078
复制相似问题