Я изучаю MEF, и я хотел создать простой пример (приложение), чтобы увидеть, как он работает в действии. Таким образом, я подумал о простом переводчике. Я создал решение с четырьмя проектами (DLL-файлы):Правильное использование атрибута [Import] в MEF
Контракты
Веб
BingTranslator
GoogleTranslator
Контракты содержит интерфейс 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), и вернуть результат обратно пользователю. Таким образом, в приложении Web я зависим от переводчика. Поэтому я создал контроллер, таким образом:
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 на этом сайте, но я не мог понять, что не так с моим примером. Может кто-нибудь, пожалуйста, скажите мне, что я пропустил здесь?
Благодарим за ответ @Aliostad, но, честно говоря, я не понял, что мне следует сделать, чтобы '[Import]' работал с моим свойством «Переводчик». –
@SaeedNeamati OK, я обновил, чтобы продемонстрировать, как его использовать. – Aliostad
Ну, вот ваш коллега для вашего взгляда - MEF является частью .NET и довольно хорошей картой DI сама по себе. Использование другого в большинстве случаев не оправдано и просто вводит технологию ANOTHER без усиления (т. Е. Значение обслуживания отрицательное). Просто закончить 18-месячный проект ТОЛЬКО с помощью MEF;) Работал неплохо. – TomTom