3

MVC3 プロジェクトの IOC コンテナーに spring を使用しています。IUserIdentity インターフェイスにコンストラクターが依存する基本コントローラーを作成しようとしています。抽象クラスのアプリケーション コンテキスト ファイルでコンストラクターの依存関係を 1 回定義したいと考えており、Spring が派生クラスごとにそれを注入できることを望んでいました。

public abstract class ControllerBase : Controller
{
    private readonly IUserIdentity _userContext;

    public ControllerBase(IUserIdentity userContext)
    {
        _userContext = userContext;
    }
}

public class ChildController : ControllerBase
{
   private readonly IChildDependency _childService;
   public ChildController(IUserIdentity userContext, IChildDependency childService)
    : base(userContext)
   {
       _childService= childService;
   }
}

すべての派生クラスの UserIdentity を再定義せずに、次のようなものを定義する方法があることを望んでいました-(それがどのように機能するかはわかりません)。

<object id="ControllerBase" abstract="true" singleton="false" >
    <constructor-arg index="0">
      <ref object="DefaultUserIdentity"/>
    </constructor-arg>
</object>
<object id="ChildController" singleton="false"  >
    <constructor-arg index="1" >
      <ref object="ConcreteChildDependency" />
    </constructor-arg>
</object>

予想通り、このようなことをすると、Spring は派生 (ChildController) クラスの最初の引数に何を入れればよいかわかりません。

4

1 に答える 1

3

次の属性ControllerBaseを使用してオブジェクト定義を参照してみてください。parent

<object id="ControllerBase" abstract="true" singleton="false" >
    <constructor-arg index="0">
      <ref object="DefaultUserIdentity"/>
    </constructor-arg>
</object>
<object id="ChildController" singleton="false" parent="ControllerBase" >
    <constructor-arg index="1" >
      <ref object="ConcreteChildDependency" />
    </constructor-arg>
</object>

これChildControllerにより、からオブジェクト定義を「継承」できますControllerBaseオブジェクト定義の継承の詳細については、spring.netのドキュメントを参照してください。コンストラクター引数からインデックス属性を削除することをお勧めします。コンストラクターの引数型を暗黙的に解決できる場合は、これらは必要ありません。もちろん、ChildController型の定義が必要です。

于 2012-05-29T21:21:27.407 に答える