gpt4 book ai didi

c# - 打破 .NET MEF 导入链

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:49 27 4
gpt4 key购买 nike

对于此示例,您可以假设顶层正在导入 ClassA。只要您导入所有内容(即 ClassX),MEF 似乎就可以很好地工作。通常你不需要导入,因为 classB 在同一个命名空间/文件中。结果,导入链现在已断开,并且 myLog 导入从未被组合。在我的示例中,ClassB 试图导入记录器服务,这几乎是所有类都可能需要的。

如果有的话,哪个是针对此问题的预期/最佳 MEF 解决方案?

1) 一旦导入链中断,就永远不要再使用导入。相反,您必须开始创建/将所有类型传递给构造函数(即 new ClassB(myLog))。这在这个例子中有效,但如果链中有中间类不使用参数,它就会很困惑。

2) 使用System 命名空间中的IServiceLocator 来导入ClassB。据我所知,ServiceLocator(例如 Prism Framework)的存在只是为了抽象依赖注入(inject)方案。对于此示例,如果 ClassB 可以导入 IServiceLocator,则它可以导入 ILogger。

3) 回到顶层调用 ComposeParts(ClassB)。为了防止顶层依赖于 ClassB,我可以让 classB 实现顶层导入的接口(interface) (IComposeMe)。然后顶层将为所有 IComposeMe 导入的容器上的 ComposeParts。我不认为这是预期的解决方案,因为它没有在 MEF 框架文档中描述或使用。

4)其实我没思路,请帮忙...

class ClassA {

// Imports within ClassX will get composed
[Import]
ClassX myClassX;

// Imports within ClassB will NOT be composed!
var myClassB = new ClassB
}

class ClassB {

// Fails because ClassB is never Composed
[Import]
ILogger myLog;

myLog.Display("Hello World");
}

[Export]
class ClassX {

// Works - Imports are satified when ClassX imported
[Import]
ILogger myLog;

myLog.Display("Hello World");
}

最佳答案

如果您遵循依赖注入(inject)模式,首选方法是什么? 不要破坏导入链。您的应用程序中应该有一个单一的组合根,组件连接在一起。组件本身不应该关心获取它们的依赖项。

诚然,在实践中您必须处理现有代码(以及其他对 DI 持怀疑态度的开发人员),因此您不能总是“一路向下”进行依赖注入(inject)。在这些情况下,您可以将容器公开为全局变量并从那里提取必要的依赖项。

将容器公开为全局本质上是服务定位器模式。它有一些 disadvantages虽然。

关于c# - 打破 .NET MEF 导入链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7276412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com