Я изучаю MEF и хотел создать простой пример (приложение), чтобы посмотреть, как это работает в действии. Таким образом, я подумал о простом переводчике. Я создал решение с четырьмя проектами (файлы DLL):
Контракты
Интернет
БингПереводчик
GoogleTranslator
Contractsсодержит интерфейс ITranslate
. Как следует из названия, он будет содержать только контракты (интерфейсы), поэтому его могут использовать экспортеры и импортеры.
public interface ITranslator
{
string Translate(string text);
}
BingTranslatorи GoogleTranslatorявляются экспортерами этого контракта. Они оба реализуют этот контракт и предоставляют (экспортируют) различные услуги перевода (один из Bing, другой из Google).
[Export(typeof(ITranslator))]
public class GoogleTranslator: ITranslator
{
public string Translate(string text)
{
// Here, I would connect to Google translate and do the work.
return "Translated by Google Translator";
}
}
и BingTranslator
:
[Export(typeof(ITranslator))]
public class BingTranslator : ITranslator
{
public string Translate(string text)
{
return "Translated by Bing";
}
}
Теперь в моем проекте Webя просто хочу получить текст от пользователя, перевести его с помощью одного из этих переводчиков (Bing и Google) и вернуть результат пользователю. Таким образом, в моем веб-приложениия завишу от переводчика. Поэтому я создал контроллер таким образом:
public class GeneralController : Controller
{
[Import]
public ITranslator Translator { get; set; }
public JsonResult Translate(string text)
{
return Json(new
{
source = text,
translation = Translator.Translate(text)
});
}
}
и последний кусок головоломки должен состоять в том, чтобы склеить эти компоненты (части) вместе (чтобы составить общую песню из более мелких частей). Итак, в Application_Start
проекта Webу меня есть:
var parts = new AggregateCatalog
(
new DirectoryCatalog(Server.MapPath("/parts")),
new DirectoryCatalog(Server.MapPath("/bin"))
);
var composer = new CompositionContainer(parts);
composer.ComposeParts();
, в котором /parts
— это папка, куда я бросаю GoogleTranslator.dllи BingTranslator.dll(экспортеры находятся в этих файлах), а также в папке /bin
У меня просто есть файл Web.dll, который содержит импортер. Однако моя проблема заключается в том, что MEF не заполняет свойство Translator
контроллера GeneralController
необходимым транслятором. Я прочитал почти все вопросы, связанные с MEF на этом сайте, но я не мог понять, что не так с моим примером. Кто-нибудь может сказать мне, что я здесь пропустил?