【发布时间】:2012-05-28 20:16:02
【问题描述】:
我正在学习 MEF,我想创建一个简单的示例(应用程序)来看看它是如何工作的。于是我想到了一个简单的翻译器。我创建了一个包含四个项目(DLL 文件)的解决方案:
合同
网络
必应翻译
谷歌翻译
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)进行翻译,然后将结果返回给用户。因此,在我的 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)
});
}
}
最后一块拼图应该是将这些组件(部分)粘合在一起(从较小的部分组成整首歌曲)。所以,在 Web 项目的Application_Start 中,我有:
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 文件的文件夹(导出器位于这些文件中),并且在 @987654330 @ 文件夹
我只有包含导入器的 Web.dll 文件。但是,我的问题是,MEF 没有使用所需的翻译器填充GeneralController 的Translator 属性。我在这个网站上阅读了几乎所有与 MEF 相关的问题,但我无法弄清楚我的示例有什么问题。谁能告诉我我在这里错过了什么?
【问题讨论】:
标签: c# asp.net-mvc-3 model-view-controller mef extensibility