【发布时间】:2011-09-01 20:54:07
【问题描述】:
对于此示例,您可以假设顶层正在导入 ClassA。只要您导入所有内容(即 ClassX),MEF 似乎就可以很好地工作。通常你不需要导入,因为 classB 在同一个命名空间/文件中。结果,导入链现在被破坏,并且 myLog 导入永远不会被组合。在我的示例中,ClassB 正在尝试导入 Logger Service,这几乎是所有类都希望的。
如果有的话,哪个是该问题的预期/最佳 MEF 解决方案?
1) 一旦导入链中断,永远不要再使用导入。相反,您必须开始创建/将所有类型传递给构造函数(即 new ClassB(myLog))。这在本示例中有效,但如果链中存在不使用参数的中间类,则会很混乱。
2) 利用 System 命名空间中的 IServiceLocator 来导入 ClassB。据我所知,ServiceLocator(例如 Prism 框架)的存在只是为了抽象依赖注入方案。对于此示例,如果 ClassB 可以导入 IServiceLocator,那么它可以导入 ILogger。
3) 回到顶层调用 ComposeParts(ClassB)。为了防止顶层依赖于 ClassB,我可以让 classB 实现顶层导入的接口 (IComposeMe)。然后顶层将 ComposeParts 在容器上用于所有 IComposeMe 导入。我不认为这是预期的解决方案,因为 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");
}
【问题讨论】: