2014-12-22 2 views
2

Я начинаю использовать MEF с моим приложением MVC, так что он следует за SOLID priciples.Использование MEF с MVC

Я задал этот вопрос на прошлой неделе: Should a dependency be injected many "levels" up than it is needed? и часть того, что я попросил (в комментариях), если у вас есть два конструктора;

Один конструктора для зависимостей инъекций

Другого construtor без параметров

И в contstructor без параметров конкретизирует экземпляры зависимостей необходимо, то это должны сделать спорный Service Locator. Ответ заключался в том, что класс не должен создавать собственные зависимости. Хорошо, я получаю это, но глядя на эту MS учебник по MEF:

http://msdn.microsoft.com/en-us/library/hh708870(v=vs.110).aspx

Они говорят, вы должны иметь два конструктора:

public HomeController() : this(new TraceLogger()) 
    { 
    } 

public HomeController(ILogger logger) 
{ 
    _logger = logger; 
} 

Но от того, что я сказал, первый конструктор - нет-нет, поскольку класс создает свою собственную зависимость?

Кроме того, в учебнике MS просто скажет: замените второй конструктор следующим образом:

public HomeController([Import("myTraceLogger")]ILogger logger) 
    { 
     _logger = logger; 
    } 

В чем смысл? Я все еще должен предоставить экземпляр ILogger ... если я не пропущу что-то? Я удалил конструктор по умолчанию:

public HomeController() : this(new TraceLogger()) 
    { 
    } 

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

+0

Причиной двух конструкторов здесь для тестирования сценариев. Вы используете конструктор без параметров в Unit Tests, но используете конструктор IoC в своем фактическом коде. Я до сих пор не рекомендую этого, потому что он все еще создает зависимости в самом классе, но его общий сценарий. –

ответ

1

OK. Таким образом, вы можете использовать MEF для инъекций Dependancy Injection и впрыскивать части, но лично я бы этого не сделал. Производительность, которую я видел на ней, довольно тяжелая. Если вы используете его неправильно, он также может легко протекать и потреблять память.

Вы можете применить свои твердые принципы к другим методам. Используйте хорошо известный контейнер инверсии управления (IoC), такой как StructureMap или AutoFac. Вы можете добавить пакет nuget в свое приложение MVC, написать несколько строк кода установки в глобальном asax, и ваши конструкторы будут автоматически работать. Они также гораздо более прощающие и более легкие в настройке и настройке.

Когда приложение запускается и создает контейнер IoC (или когда объект сначала запрашивается в зависимости от ваших настроек), зависимость «Создана» и вводится в ваш конструктор классов. Эффективно вам не нужно делать ничего, кроме указания контейнера IoC, где можно найти экземпляр класса Logger (т. Е. В какой сборке), если вы запрашиваете класс ILogger.

public HomeController(ILogger logger) 
{ 
    _logger = logger; 
} 

Отметьте эти сообщения.

+1

Версия MEF 1 была довольно плохая, но MEF версия 2 довольно хорошая производительность (конечно, не самая лучшая, но хорошая в целом). См. Http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison. Тем не менее, да, я бы порекомендовал Unity, SimpleInjector, StructurMap и т. Д. По MEF, поскольку MEF не технически контейнер IoC, хотя он играет по телевизору. –

2

Похоже, вы должны использовать атрибут [ImportingConstructor] на своем HomeController(ILogger) конструкторе. Как так:

[ImportingConstructor] 
public HomeController([Import("myTraceLogger")]ILogger logger) 
{ 
    _logger = logger; 
} 

MEF создает одноэлементный экземпляр ILogger (по умолчанию). Он обязательно создаст ILogger, прежде чем он создаст класс HomeController.

Локатор сервисов удобен при создании списка объектов с экспортированными типами как часть некоторого рабочего процесса.

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