我正在学习 MEF,我想创建一个简单的示例(应用程序)来看看它是如何工作的。于是我想到了一个简单的翻译器。我创建了一个包含四个项目(DLL 文件)的解决方案:
合同
Web
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 相关的问题,但我无法弄清楚我的示例有什么问题。谁能告诉我我在这里错过了什么?