いただきありがとうございます。
ここでは簡単な例を示します(何か不足しているかどうかを確認してください)。
あなたは注入するためのコンポーネントを必要とするすべてのファースト:
public interface IMefTest
{
string Message {get;}
}
[Export(typeof(IMefTest))]
public class MefTest: IMefTest
{
public string Message {get { return "Hello World"; }}
}
次は(これはコンテナに似ていますが、正確ではない)CompositionService
を設定する必要があります。私たちはこれをどこかに設定して、一般的に話すことができるようにしたいのです。これは、あなたがインポートを満たすために呼び出す場所です(この後のコードスニペットで詳しく説明します)。
私は私のサンプルプロジェクトでApp.xaml.csでこれを立ち往生:この上
static System.ComponentModel.Composition.ICompositionService _compositionService = null;
public static System.ComponentModel.Composition.ICompositionService CompositionService
{
get
{
if (_compositionService == null)
((App)App.Current).loadCompositionService();
return _compositionService;
}
}
private void loadCompositionService()
{
// Create a catalog where MEF will search for exported parts to plugin
var catalog = new System.ComponentModel.Composition.Hosting.AssemblyCatalog(GetType().GetTypeInfo().Assembly);
_compositionService = catalog.CreateCompositionService();
}
は、ほんの少しの情報。私たちは、MEFが輸出されたタイプを探すこのアセンブリだけを調べることを意味するアセンブリカタログを作成しました。他のタイプのカタログもありますし、2つ以上のカタログを組み合わせることができるはずです。
[OK]を私のページ(BTW、私はこれをC#HelloWorldの例には、MSDNのGetting Startedドキュメントから作成しました)。
カタログ内の部品のインスタンスを取得するには、取得するクラスにプロパティを追加し、import属性を追加する必要があります(コンストラクタで引数を指定する方法もありますが私はこの例では)
[Import]
public IMefTest Tester { get; set; }
をシンプルに滞在しようとしている、あなたは、このクラスで構成サービスのSatisfyImportsOnceメソッドを呼び出す必要があります。私は、コンストラクタでこれを行なったし、私はこのようにそれをやった:
if(App.CompositionService != null)
App.CompositionService.SatisfyImportsOnce(this);
(サービスが存在することを確認しますが、私の一部にやり過ぎ..ですそれが存在している必要があります)。 この手順の後、実際にはクラス内でTester.Message
プロパティを使用できます。 MEFにはさらに多くの選択肢があります。私はこれがあなたを助けてくれることを願っています(もし私があなたのために請求するクライアントから貴重な時間を費やして私を答えとしてマークしたら)
また、単にあなたはコンテナを呼び出して、何らかの型のインスタンスを返します。これを他の形式のMEFでも行うことができます。したがって、WinRTで実行できるはずだと思いますが、現時点では正直に分かりません)。
あなたが解決策を見つけた私は、工場・プロバイダーや工場のキャッシュを追加しますね?私はExportFactoryとSatisfyImportsOnceで終わったが、私はそれに満足していない、ただGetExportedValuesが必要 –
私はメトロスタイルのアプリのMEFを開発している人の1人と連絡を取り合っている。彼は、SatisfyImportsOnceは現在のところアイテムを構成する唯一の方法だと私に言った。彼は、SatisfyImportOnceによってサポートされていない具体的なシナリオを教えてくれました。 http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/6aff302d-867a-4921-86ae-b8088c47560f 当面、MEFへの小さな代替案が見つかりました。 http://metroioc.codeplex.com/ また、あなたに役立つことを願っています。 – Enyra
私はプロジェクト間でいくつかのコードを共有したいので、他のフレームワークを使用したくありません。すぐに私はすでにソースプロジェクトでMEFを使用していますが、私はそれを使い続けたいと思います。私のニーズはそれほど大きくないので、欠けている機能を追加することを好みます。現在のソリューションを回答として追加します。 –