6

autofac コンテナーをより有効に活用するために、既存のコードベースを作り直しています。私が抱えている状況は、古典的なServiceLocatorアンチパターンでコンテナからコンポーネントを直接解決するために多くのものが使用されているということです。を使用して適切な作業単位スキームを導入しようとしていますLifetimeScope

私が直面している問題は、一部のコンポーネントは、LifetimeScope実装中に子から解決する必要があり、破棄する必要がIDisposableあることです。それらがルートスコープで解決された場合、それは決して起こりません。

一部のコンポーネントがルート スコープで解決されないようにする方法はありますか? これらのケースを 1 つずつ見ていき、必要に応じてスコープを導入しているので、ランタイムのクラッシュは問題ありません。これを行う唯一の方法は、ルート ライフタイム スコープに対して一度解決され、.xml で解決される小さなダミー コンポーネントを作成し、.InstancePerLifetimeScope()それをどこかに静的に保存することです。その後、後のコンポーネントが解決されたら、それらのダミー コンポーネントの 1 つを取得し、それがルート スコープ内に存在するインスタンスと同じインスタンスであるかどうかを確認します。少し面倒ですが、もっと良い方法はありますか?

4

1 に答える 1

1

「一致する有効期間ごとのスコープ」登録を使用してみることができます。

containerBuilder.RegisterType<Foo>()
                .As<IFoo>()
                .InstancePerMatchingLifetimeScope("scope");

この方法IFooは、少なくとも 1 つの先祖ライフタイム スコープがタグ付きライフタイム スコープであり、そのタグが と等しい場合にのみ解決できます"scope"。通常、ルートの有効期間スコープはタグ付けされていないため、そこから解決しようとするIFooと、Autofac は例外をスローします。

詳細については、Autofac wikiを参照してください。

于 2013-07-23T12:13:14.717 に答える