1

WPFアプリケーションでMEFを使用していますが、エクスポートの方法が原因で、またはコンテナーのクエリの方法が原因で、エクスポートがコンテナーに反映されていないかどうかわかりません。

これが私のオブジェクト階層です:

public interface ICommonInterface
{ }

[InheritedExport]
public abstract class CommonBaseClass<T> : ICommonInterface 
{ }

public Class1 : CommonBaseClass<Class1>
{ }

public Class1 : CommonBaseClass<Class2>
{ }

質問の範囲外の理由で、基本クラスでTの実装を使用しています。それがそこにある理由です。CommonBaseClassのジェネリックを削除し、それが継承されたクラスである場合、次のようにコンテナからエクスポートを取得できます。

var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
var exports = container.GetExportedValues<CommonBaseClass>();

私がやりたいのは、ジェネリック版のエクスポートを取得することです。

var exports = container.GetExportedValues<CommonBaseClass<ICommonInterface>>();

エラーはなく、結果はありません。

4

3 に答える 3

0

MEF は、IoC コンテナーとまったく同じではありません。MEF は継承エクスポートを行いません。属性を追加する必要があります

[Export(type(CommonBaseClass<ICommonInterface>))] 
于 2013-02-28T19:40:47.953 に答える
0

MEF は、そのままでは「オープン ジェネリック」をサポートしていません。そのhttp://mefcontrib.codeplex.com/wikipage?title=Generic%20Catalogに役立つ MefContrib プロジェクトがあります。

ただし、この状況で私が行うことは、ではなく[InheritedExport]your の属性を使用することです。このような:ICommonInterfaceCommonBaseClass<T>

[InheritedExport]
interface ICommonInterface {}

public abstract class CommonBaseClass<T> : ICommonInterface { }

public class Class1 : CommonBaseClass<Class1> { }

public class Class2 : CommonBaseClass<Class2> { }

次に、これを行う立場にあります。

var exports = container.GetExportedValues<ICommonInterface>();

実装ICommonInterfaceしている別のクラスがあり、それをコンテナーにプルしたくないとしましょう。その場合、次の[PartNotDiscoverable]属性を使用できます。

[PartNotDiscoverable]
public class Class3 : ICommonInterface {}
于 2013-03-01T00:29:44.753 に答える
0

あなたのコードはコンパイルされません。

あなたが意味したのは:

public interface ICommonInterface
{ }

[InheritedExport]
public abstract class CommonBaseClass<T> : ICommonInterface 
{ }

public class Class1 : CommonBaseClass<Class1>
{ }

public class Class2 : CommonBaseClass<Class2>
{ }

次に、次の方法でエクスポートを取得できます。

var exports = container.GetExportedValues<CommonBaseClass<Class1>>();
于 2013-03-01T00:10:09.287 に答える