2013-03-07 3 views
5

私はインターフェイスを実装する実行時にアセンブリをロードするコンソールアプリケーションを構築しようとしています。要点は、.dllを変更することによって変更できる命令で.dllを作成することです。StructureMap: 'AddAllTypesOf'がObjectFactoryにアセンブリを追加していませんか?

私のVS2012ソリューションは、インターフェイス、それを実装するライブラリ、およびコンソールアプリケーションの3つのプロジェクトから構成されています。 (このため、3つにはそれぞれ独自の名前空間がありますが、これは問題なのでしょうか?)ライブラリとコンソールアプリケーションには両方ともインタフェースプロジェクトへの参照があります。

ObjectFactoryにアセンブリを追加した後は、GetAllInstancesを使用してもアセンブリが見つかりません。彼らはAssembliesFromPathを使用すると見つかりましたが、追加が機能していないようです。

はここに私のコードです:ケース誰に

var dir = "..\\..\\..\\ComputeLibrary\\bin\\Debug"; 
ObjectFactory.Initialize(cfg => 
{ 
    cfg.Scan(scanner => 
    { 
     scanner.AssembliesFromPath(dir); 
     scanner.AddAllTypesOf(typeof(ICompute)).NameBy(i => i.Name); 
    }); 
}); 
var list = ObjectFactory.GetAllInstances<ICompute>().ToList(); 
list.ForEach(item => item.Test()); 

は、ソリューション全体を見てみたい、それがhere可能です。

私はおそらくここで何か間違っていますが、私はそれが何であるかを見つけることができません。 これはどのように使用されるのでしょうか?あるいは、私はこのようなことをしてMEFに目を向けるべきですか?

+1

文書によると、あなたのコードは、期待されるものと一致しているようです。これをデバッガでブレークポイントで実行し、 'scanner.AssembliesFromPath(dir);'行が実行された後にスキャナインスタンスが予期されたアセンブリを持つことを確認しましたか? – cfeduke

+0

はい、その行を実行した後、スキャナには2つのアセンブリが含まれています。その前にはインターフェイスとライブラリは0です。[screenshot](http://i.imgur.com/Z0znR0Y.png) – Yves

+0

'.NameBy'を削除しますか?私は、クラスがスキャナに追加されるのを妨げている例外が飲み込まれているかどうか疑問に思っています。 – cfeduke

答えて

3

これは、私が構造マップのGoogleグループのthis threadを思い出すまで、しばらく私を困惑させました。

アプリケーションを実行すると、ComputeInterface.dllアセンブリが読み込まれます。 ComputeLibraryフォルダをスキャンすると、同じアセンブリが再度読み込まれ、1つのアセンブリからしかインターフェイスを実装できないため、これは混乱しやすい構造マップです。 ComputeLibrary \ bin \ DebugフォルダからComputeInterface.dllを削除しようとすると、動作します。

+0

ありがとう、インターフェイスのDLLを削除すると、本当に問題を解決しました。私は決してそれを思い付くだろう。 – Yves