2016-04-07 24 views
1

Autofacの使用に奇妙な問題が発生しました。 AddSomethingToAListは、静的リストにリソースを追加し、それは錫で言うまさにませasyncのように動作するAutofacモジュールを登録する

builder.RegisterType<Foo>().As<IFoo>(); 
// ... 

AddSomethingToAList(bar); 
// ... 

:私は、そのLoad方法このようになりますモジュールを持っています。このメタデータは依存関係注入のために登録されているタイプに直接関係するため、メタデータを追跡するために使用され、モジュールの内部に保持されます。

その後、私のコードは次のように見える設定方法があります。

var builder = new ContainerBuilder(); 
builder.RegisterModule(myModule); 

foreach(var whatever in previouslyAddedToList) 
{ 
    doSomething(whatever); 
} 

あなたが見ることができるように、我々はモジュールを登録する(私はそのモジュールのためのLoadを呼び出すことを期待している)、その後、我々がいくつかのものを行いますモジュールがロードされたときに追加されたリスト。

これは奇妙な部分です:何かが追加される前にリストが処理されています。これはまったく予期せぬことです(コードが同期的かつ確定的だった場合)。モジュールが非同期に処理されているかのようです。 builder.RegisterModule(myModule)の代わりにmyModule.Load(builder)を呼び出すと、期待どおりに機能します。

ドキュメントの中には、非同期であるとは言わず、非常にうまくいきません。私は、モジュールのLoadメソッドとそのリストを処理しているポイントにブレークポイントを置くことで、この動作を追跡しました。

だから、RegisterModuleというのはこの異常な実行順序を引き起こしますか?どうして?どうやって止めるの?

+1

あなたは実際にあなたのコンテナを構築していますか?そして、なぜそれが必要な場所より先に呼び出される 'Load'メソッドを期待していますか? –

答えて

3

Autofacのすべては、内部的に一連のコールバックとして登録されます。 RegisterModuleを呼び出すと、ContainerBuilderはモジュールにLoadを呼び出すためのラムダを追加します。

ContainerBuilderは、最終的に実行されるときにBuildを呼び出すまで、これらのコールバックをすべて保持します。そのため、すぐに呼び出されたLoadメソッドは表示されません。

これを変更する方法はありません。

代わりに、私は強くのみは、任意の副作用を持っていない依存関係を登録するためにモジュールを使用してをお勧めします。

関連する問題