これを行う方法に関する記事やリンクが見つかりませんでした。明らかな問題のようです(たとえば、ソースコードを持っていない場合や、MEF用に書かれていない既存のタイプを使用したい場合など)心の中で)エクスポート属性を持たないMEFでタイプをエクスポートするにはどうすればよいですか?
9
A
答えて
15
あなたはコンテナに既存のオブジェクトのインスタンスを追加するために探しているなら、あなたはCompositionContainer.ComposeExportedValue
メソッドを使用することができます
container.ComposeExportedValue<MyClass>(myClassInstance);
をあなたが本当にかかわらず、探しているものは、おそらく新しい慣習ですベースのプログラミングモデルで、属性ではなく命名規則に基づいてパーツを作成できますが、この機能は.NET 4.5でのみ使用できます。
使用例(これはIController
としてIController
を実装myAssembly
内のすべての種類をエクスポートします):
var registration = new RegistrationBuilder();
registration.ForTypesDerivedFrom<IController>()
.Export<IController>();
var catalog = new AssemblyCatalog(myAssembly, registration);
var container = new CompositionContainer(catalog);
MEFの新条約モデルcan be found hereを使用する方法の良い例。
これが役に立ちます。あなたはInheritedExport属性とのインタフェースをマークすると
10
、カタログ内のすべてのモジュールは、彼らがエクスポート属性かでマークされているかどうか、このインタフェースを実装しており、輸出されています。
インタフェース:
[InheritedExport]
public interface IContract { ... }
モジュール:
// No [Export] attribute
public class ModuleImplementation : IContract { ... }
今MEFは、モジュールを挿入します。
完全に感謝します。悲しいことに、これは4.5フィーチャーだけのようです。 – blue18hutthutt
プレビュー版であなたの例をベースにしていると思いますか? [Implements]メソッドはありません。[代わりに](https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.registration.registrationbuilder.aspx)いくつかの 'ForType' /' ForTypesメソッド。 – Stijn
@Stijnあなたが正しいです、それ以来、APIは変更されました。--ForTypesDerivedFrom'が、 'Implements'を置き換えました。私はそれに応じて私の答えを編集しました。 –