4

ASP.NET MVC 4 アプリケーションで依存関係の挿入に Unity コンテナーを使用しています。

特定のコントローラー (ProductController など) に対して、次のような依存性注入のシナリオがあります。

  1. ProductController コンストラクターは、IProductsRepository インスタンスを受け取ります。
  2. IProductsRepository の実装には、IProductsService インスタンスを受け入れるコンストラクターがあります。
  3. IProductsService の実装には、Web 要求の Cookie から取得される認証トークン文字列を受け入れるコンストラクターがあります。

コントローラー インスタンスが作成された後にのみ認証トークン Cookie を取得できることを考えると、このシナリオで自動依存性注入を行う正しい方法は何ですか?

4

2 に答える 2

2

の作成を遅らせる必要があるProductService場合は、

  • そのサービスのカスタム ファクトリを注入する
  • DI コンテナーに Type のデリゲート ファクトリを自動生成させ、Func<IProductService>そのデリゲートをコントローラーに注入します。
  • サービスの作成の遅延をコンシューマから隠す遅延プロキシをコンテナに生成させる

消費者にとって完全に透過的であるため、私は3番目の選択肢を好みますIProductService

于 2012-10-09T10:02:49.360 に答える
1

次の 2 つのオプションがあると思います。

1 container.Resolve() を使用し、使用可能な場合はパラメーターを渡します。

IProductsServiceしたがって、コンストラクターでを要求する代わりに、次のProductsRepositoryようにします。

IProductsService anInstance = container.Resolve<IProductsService>(new ParameterOverride("authenticationTokenString", "myValue"));

これは ParameterOverride と呼ばれます。MSDN のドキュメントは次の場所にあります:オーバーライドを使用したオブジェクトの解決

2 プレーンな認証トークン文字列を渡す代わりに、これをインターフェイスの背後にカプセル化して渡します。IProductsServiceを取り、そのIAuthenticationTokenProviderクラスに必要なトークンを要求します。実装は、必要なオブジェクトが作成された後にアクセスして、正しい値を取得します。

私はオプション 2 を選択します。これにより、デザインがよりクリーンに保たれ、手作業なしで Unity がすべての依存性注入を処理できるようになります。

于 2012-10-09T10:01:42.537 に答える