5

内部サービス用に複数のコンテナーをサポートしようとしているオープン ソース プロジェクトに貢献しています。サポートされているコンテナーの要件の 1 つは、登録の順序が重要であることです。そのため、インターフェイスの複数の実装が特定の順序で登録されている場合、それらのサービスのリストが解決されると、実装は登録されたのと同じ順序で返される必要があります。

var builder = new ContainerBuilder();
builder.RegisterType<PreferredService>().As<IService>();
builder.RegisterType<AlternativeService>().As<IService>();
builder.RegisterType<AdditionalService>().As<IService>();
...
// Get the first (preferred) implementation of IService.
var possibleServices = container.Resolve<IEnumerable<IService>>();
IService idealServiceImplementation = possibleServices.FirstOrDefault();

私のテストでは、Autofac がサービスを逆順で返すことが示されています。これは常に当てはまりますか?毎回逆の順序で解決されると信頼できますか? この動作は、異なるインターフェイスの他の登録の後にいくつかの後のサービスを登録した場合でも一貫していますか? リストの Resolve への暗黙的な呼び出しをインターセプトできますか?

登録順序が重要であることをAutofacに指示する方法はありますか?

4

1 に答える 1

4

を使用しない限り、Autofac 登録は常に「最後の登録が優先されます」PreserveExistingDefaults()。実装をざっと見てみると、登録がリンクされたリストとして保存され、デフォルトの動作が最初にPreserveExistingDefaults()追加され、最後に追加されることがわかります。1 つのサービスを解決すると、リストの最初の項目が取得されます。enumerable を解決すると、その順序が得られます。その動作が決して変わらないことが保証されているかどうかはわかりません。

私だったら、現在の動作に依存しますが、動作が変更された場合に失敗する自動テストを作成します。

于 2012-12-21T19:37:53.847 に答える