2015-06-09 3 views
1

У меня возникла странная проблема, когда объект может быть импортирован в класс просто отлично. Если я создаю экземпляр другого класса из первого класса, попробуйте импортировать тот же объект в дочерний класс, импорт всегда терпит неудачу!Объект импорта MEF в дочернем классе NULL

Первый класс:

public class Foo { 

    [Import] 
    private SomeExportedType foobar; 

    public Foo() { 
     foobar.Test(); // Works just fine 

     Bar bar = new Bar(); 
     bar.Test(); 
    } 
} 

Второй класс:

public class Bar { 

    [Import] 
    private SomeExportedType foobar; 

    public void Test() { 
     foobar.Test(); // This fails because foobar is NULL 
    } 
} 

Все это псевдо-код, или, конечно, но он правильно отражает то, как построен мой код. Почему происходит сбой импорта в дочернем классе?

+0

Как создается экземпляр класса «Foo»? Импорт не выполняется, если вы просто обновляете класс, используя его конструктор ... часть причины, по которой я ненавижу инъекцию свойств на самом деле ... не точно объявляет ее зависимости. – BenjaminPaul

+0

Как упоминалось в моем комментарии к вашему ответу, «Foo» создается MEF. – GTHvidsten

ответ

1

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

public class Foo { 

    [Import] 
    private SomeExportedType foobar; 

    [Import] 
    private Bar bar; 

    public Foo() { 
     foobar.Test(); // Works just 

     bar.Test(); // Should also work fine. 
    } 
} 

Попробуйте импортировать экземпляр вашего класса Bar, а .. что так оно и будет инстанцировано по MEF и импорт удовлетворен.

+0

Так оно и было. Я видел комментарии об этом ранее, но я думал, что до тех пор, пока Foo был создан MEF, Bar также сохранит MEF-соединение даже при создании экземпляром Foo. Видимо, нет. Я изменил реализацию, так что Bar экспортирует себя, а Foo импортирует ее, тогда она работает как шарм. – GTHvidsten

+0

@GTHvidsten Это одна из проблем, с которыми я сталкиваюсь с «Injection», я чувствую, что она скрывает зависимости, которые требует класс. Вместо этого я предпочитаю использовать атрибут «ImportingConstructor», который позволяет мне обновлять класс вручную, если это необходимо. – BenjaminPaul

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