私は MEF を学んでおり、簡単な例 (アプリケーション) を作成して、実際にどのように機能するかを確認したいと考えていました。そこで、簡単な翻訳機を考えました。4 つのプロジェクト (DLL ファイル) を含むソリューションを作成しました。
コントラクト
Web
BingTranslator
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) のいずれかで翻訳し、結果をユーザーに返したいと考えています。したがって、私の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();
これは、 GoogleTranslator.dllおよびBingTranslator.dllファイル (エクスポーターはこれらのファイルにあります)/parts
をドロップするフォルダーであり、フォルダーには、インポーターを含むWeb.dllファイルがあります。ただし、私の問題は、MEF がのプロパティに必要なトランスレータを入力しないことです。このサイトで MEF に関連するほとんどすべての質問を読みましたが、私の例の何が問題なのかわかりませんでした。私がここで見逃したものを教えてください。/bin
Translator
GeneralController