对于此示例,您可以假设顶层正在导入 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");
}