2016-07-14 29 views
1

MEFを使用してモジュラーアプリケーションを構築しようとしています。
しかし、構成中はSetExportedValue(..., ...)を無視して、必要な値/オブジェクトが見つからないようです。パートコンストラクタでMEFが失敗するのはなぜですか?

System.ComponentMode:これは、次のエラーメッセージをもたらす

interface IPlugin { } 

class MyClass 
{ 
    [ImportsMany(typeof(IPlugin))] 
    public IEnumerable<Lazy<IPlugin>> Plugins; 

    public LoadParts() 
    { 
     var ac = new AggregateCatalog(); 
     ac.Catalogs.Add(new AssemblyCatalog(typeof(PluginManager).Assembly)); 

     // imagine adding some DirectoryCatalogs here 

     var cc = new CompositionContainer(ac); 
     cc.ComposeExportedValue("MyValue", someinstance); 
     cc.ComposeParts(this); 
    } 
} 

[Export(typeof(IPlugin))] 
class MyPart : IPlugin 
{ 
    [ImportingConstructor] 
    public MyPart([Import("MyValue")] sometype arg) 
    { } 
} 

:ここ

は私(匿名化および簡略化された)コードでありますl.Composition Warning:1:ComposablePartDefinition 'MyNamespace.MyPart'が拒否されました。組成は変わらない。変更は、次のエラーのために拒否されました:コンポジションで単一の合成エラーが発生しました。根本原因は以下のとおりです。詳細については、CompositionException.Errorsプロパティを確認してください。で結果の

ContractName MyValue 
RequiredTypeIdentity somenamespace.sometype 

1)いいえ輸出が制約に一致する見つかりませんでしたインポート「MyNamespace.MyPart..ctor(パラメータ=」... "ContractName =" を設定することはできません... ") 'の部分に' MyNamespace.MyPart 'があります。
要素:MyNamespace.MyPart..ctor(パラメータ= "... " ContractName =" ... ") - > MyNamespace.MyPart - > DirectoryCatalog(パス=" ./")

一部のコンストラクタの仕組みを誤解していますか?
コンストラクタパラメータを受け入れる方法を教えてください。 claificationため


編集:someinstancesometypeの特定のインスタンスです。コンテナに型を追加するのではなく、特定のクラスインスタンスを追加したいと思います。

答えて

1

ImportingConstructorには値だけでなく有効な契約も必要です。

これは私のコンストラクタがどのように機能するかを、例です:

[ImportingConstructor] 
    public MyType([Import] IStatus status, [Import] IProtocoll protocoll) { 
    } 

あなたが見ることができるように、あなたはコンストラクタ・パラメータとしてのインタフェースを使用する必要があります。

これらのインターフェイスは、必要な属性がなく単純で単純です。

IProtocollのスニペット

public interface IProtocoll { 

    IProtocollStateController ProtocollController { get; set; } 

    void WriteProtocoll(string action, string message, bool? result, Guid conditionId); 

    void WriteProtocoll(Protocoll protocoll); 

    List<Protocoll> GetAllProtocoll(); 
    } 

私はあなたが有効なインターフェイスで、あなたのMyValueをオンにすることをお勧め。これは、単純な文字列の場合は少し過剰すぎるかもしれませんが、MEFの動作方法です。

乾杯

+0

「MyValue」には特定のクラスインスタンスが含まれていますが、私がそのクラスを '[Export]'するだけの場合、私は望んでいない構成で新しいインスタンスを生成しますよね? –

+0

あなたのやり方によって異なります。 [This](https://stefanhenneken.wordpress.com/2011/08/30/mef-teil-6-constructor-injection/)はドイツ語ですが、コードは英語であり、その仕組みを示しています。さらに、コンストラクタパラメータをシングルトンにすることで、それ以上のインスタンスを持たないようにすることができます – lokusking

関連する問題