1

MVC 3コントローラークラスに、次の2つのパラメーターを受け入れるメソッドがあります。

public ActionResult MyMethod(string providerName, IAuthProvider providerImpl)

IAuthProvider次のように、Unityコンテナにその名前で登録された複数の実装があります。

container.RegisterType<IAuthProvider, FacebookAuthProvider>("facebook");
container.RegisterType<IAuthProvider, GoogleAuthProvider>("google");

したがって、メソッドが呼び出されたときに、最初の引数に基づいて2番目の引数を解決したいと思います。たとえば、最初の引数が「facebook」の場合、2番目の引数はコンテナからIAuthProvider「facebook」という名前で登録された実装に解決される必要があります。

どんなアイデアも楽しみにしています!

備考:Unity.2.1.505.0を使用しています

4

2 に答える 2

3

あなたの例には非常に多くの問題があります。

  1. アクションメソッドには、パラメーターを依存性注入するのではなく、ブラウザーが送信する名前と値のペアをアクションが受け入れることができるオブジェクトに変換するModelBinderからの値を注入することを目的としています。
  2. DIフレームワークは、その範囲を超えているため、「最初のパラメーターに基づいて2番目のパラメーターをバインドする」ことはできません。DIが実行時の値に基づいてIAuthProviderに何を挿入するかを判断できる場合、それは、DIにカスタムコードを記述したことが原因である可能性があります。
  3. 必要なのはUnityにはありません。要件に合わせて、カスタムModelBinderを作成する必要があります。例については、ここここを参照してください。デフォルトのModelBinderを拡張し、アクションがMyMethodリクエスト値を調べてAuthProviderオブジェクトを自己作成し、オブジェクトを返すという条件を設定します。
  4. カスタムモデルバインダーを作成するときに、DIコンテナーからプロバイダーを取得できます。また、パラメーターを再考します。アクションが正しいプロバイダーを取得している場合、なぜそれがproviderNameを必要とするのですか?本当に必要な場合は、IAuthProvider自体から名前を取得できませんか?タイプを確認するか、.Nameメソッドを使用しますか?ProviderNameは、カスタムモデルバインダーでのみ使用されます
于 2012-05-12T07:57:47.193 に答える
0

User Autofacを使用している場合は、意図したとおりにアクション呼び出しによって注入できると思います。しかし、Unityではそれができないと思います。私はAutofacでそれをしました。

于 2013-05-31T20:18:28.090 に答える