Spring.Net 可以为所有派生类注入抽象类构造函数 arg
本文关键字:注入 抽象类 构造函数 arg 派生 Net Spring | 更新日期: 2023-09-27 18:35:44
我们在MVC3项目中将spring用于我们的IOC容器。 我正在尝试制作一个基本控制器,该控制器将依赖于我们的 IUserIdentity 接口的构造函数。 我想在抽象类的应用程序上下文文件中定义一次构造函数依赖项,并希望 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)类中的第一个参数放入什么。
尝试使用 parent
属性引用ControllerBase
对象定义:
<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
需要一个类型定义。