1

Я использую инжектор конструктора с контейнером состава MEF, и я хочу знать, как я могу заставить CompositionContainer внедрить себя в экземпляр объекта, который он предоставляет.Как получить контейнер MEF для ввода себя

+0

Делая это, вы по существу отходите от инъекции зависимостей и к [шаблону локатора службы] (http://en.wikipedia.org/wiki/Service_locator_pattern). Это может отрицательно сказаться на ремонтопригодности вашего приложения. – MattDavey

ответ

2

Чтобы создать деталь от данного объекта, вы можете использовать один из методов CompositionContainer.ComposeExportedValue.

Вот пример:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new CompositionContainer(new ApplicationCatalog()); 
     Console.WriteLine("Main: container [{0}]", container.GetHashCode()); 

     container.ComposeExportedValue<CompositionContainer>(container); 

     var exp = container.GetExportedValue<ExportThatNeedsContainer>(); 

     Console.ReadKey(); 
    } 
} 

[Export] 
public class ExportThatNeedsContainer 
{ 
    [ImportingConstructor] 
    public ExportThatNeedsContainer(CompositionContainer cc) 
    { 
     Console.WriteLine("ExportThatNeedsContainer: cc [{0}]", cc.GetHashCode()); 
    } 
} 

Это работает, однако инъекции контейнера в части, насколько я знаю, не является «нормальным» потребительная случай MEF.

+2

+1 для «инъекции контейнера в деталь, насколько я знаю, не является« обычным »вариантом использования MEF». Это будет красный флаг с любым контейнером IoC. – MattDavey

0

Я не уверен, что он может работать. Представьте, что у вас есть контейнер с тремя классами, один из них также содержит сам контейнер, который содержит три класса. Это будет stackoverflow :)

Смежные вопросы