Правильное использование атрибута [Import] в MEF

Я изучаю 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 на этом сайте, но я не мог понять, что не так с моим примером. Кто-нибудь может сказать мне, что я здесь пропустил?

7
задан Saeed Neamati 22 May 2012 в 10:37
поделиться