2012-04-22 4 views
2

Я нахожусь в процессе расширения решения, основанного на MVC 3.Использование MEF в библиотеке классов с ASP.NET MVC 3

В принципе, решение состоит из проекта MVC 3 наряду с некоторыми библиотеки классов проектов в управлять доступом к бизнесу/данным.

Я пытаюсь использовать MEF, чтобы сделать приложение плагином. например, у меня есть UserManager класса в проекте длл и я определил свои плагин следующим образом:

[ImportMany]public List<IUserHooks> Plugins {get; set;} 
foreach (var plugin in Plugins) 
{ 
    Plugin.DoTheJob(); 
} 

Как вы можете видеть, класс отделен от проекта MVC и контроллеров. В списке указан мой класс UserManager.

Я знаю, что лучший подход должен был бы сделать UserManager использовать MEF, а также (возможно инициализировать его в CTOR контроллера как public MainController(IUserManager UserManager)), но так как я просто хочу, чтобы добавить плагин поддержки решения, а не писать с нуля, я предпочитаю самый быстрый ярлык.

Как определить мой объект MEF container, чтобы иметь возможность использовать его в моей библиотеке классов. Нужно ли создавать приложение MVC с помощью MEF? Я бы предпочел подход, когда минимальная модификация была бы необходима для приложения MVC.

ответ

2

MVC3 запекается в поддержку места обслуживания. Если вы не хотите переопределять некоторые из базовых классов, но просто хотите расширить, вы можете добавить экземпляр IDependencyResolver, который использует MEF. Таким образом, вы можете использовать это как базу для расширения вашего приложения. Я написал пример на my blog.

Использование встроенной архитектуры MVC3 позволяет вам сконфигурировать ваш CompositionContainer при запуске и предоставить его остальной инфраструктуре.

Но, на самом деле вы, вероятно, не хотите разоблачать свой контейнер в своей библиотеке. Фактически, единственное, что вы должны делать, это просто отметить ваш экспорт. Причина, по которой вы можете избежать этого с помощью MEF, заключается в том, что он включен в BCL для .NET 4.0. Не связывая свои классы с MEF (или infact, связывая свои классы с локатором сервисов или контейнером с инверсией управления), он делает ваш код более переносимым, проверяемым и развязанным.

+0

Спасибо за ответ Мэтью. Я попытался протестировать ваше решение и добавил проект TestDll с помощью простого импорта и экспорта. Но свойство с атрибутом «Импорт» всегда равно нулю. Есть ли какой-либо дополнительный шаг, который я должен предпринять, чтобы иметь возможность использовать вашу инфраструктуру в качестве базы, или я должен просто указать ссылки на мои DLL с помощью импорта/экспорта и использовать их? Вы хоть представляете, что я делаю неправильно? Благодарю. – Kamyar