В этом примере вы можете предположить, что toplevel импортирует ClassA. MEF, кажется, прекрасно работает, пока вы импортируете все (например, ClassX). Часто вам не нужно импортировать, потому что classB находится в том же пространстве имен / файла. В результате цепочка импорта теперь разорвана, а импорт myLog никогда не создается. В моем примере ClassB пытается импортировать Logger Service, что может потребоваться почти всем классам.
Что, если есть, является лучшим / лучшим решением MEF для этой проблемы?
1) После разрыва цепочки импорта никогда не используйте импорт снова. Вместо этого вы должны начать создавать / передавать все типы в конструктор (т.е. новый ClassB (myLog)). Это работает в этом примере, но это грязно, если в цепочке есть промежуточные классы, не использующие аргумент.
2) Используйте IServiceLocator в пространстве имен System для импорта ClassB. Насколько я знаю, ServiceLocator (например, Prism Framework) существует только для абстрагирования схемы внедрения зависимостей. В этом примере, если 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");
}