我想使用Spring.Net在ASP.NET MVC中依赖注入一个属性,我的属性是这样的(请注意这是我输入的所有伪代码)......
public class InjectedAttribute : ActionFilterAttribute
{
private IBusinessLogic businessLogic;
public InjectedAttribute(IBusinessLogic businessLogic)
{
this.businessLogic = businessLogic;
}
public override void OnActionExecuting(ActionExecutedContext filterContext)
{
// do something with the business logic
businessLogic.DoSomethingImportant();
}
}
我正在使用控制器工厂来创建控制器,这些控制器也注入了各种业务逻辑对象。我正在从IoC容器中获取控制器......
ContextRegistry.GetContext().GetObject("MyMVCController");
我正在配置我的控制器,就像传递业务逻辑一样
<object name="MyMVCController" type="MyMVC.MyMVCController, MyMVC">
<constructor-arg index="0" ref="businessLogic" />
</object>
有没有办法配置属性的注入?我真的不想把它放到我的属性中......
public class InjectedAttribute : ActionFilterAttribute
{
private IBusinessLogic businessLogic;
public InjectedAttribute(IBusinessLogic businessLogic)
{
this.businessLogic = ContextRegistry.GetContext().GetObject("businessLogic");
}
....
答案 0 :(得分:2)
我正在配置我的控制器,就像传递业务逻辑一样
这将控制器定义为单例,这意味着它们将在所有可能是灾难性的请求中重用。确保控制器未定义为单例:
<object name="AnotherMovieFinder" type="MyMVC.MyMVCController, MyMVC" singleton="false">
<constructor-arg index="0" ref="businessLogic" />
</object>
现在,我们要回到关于属性的主要问题。
因为您希望在过滤器中使用构造函数注入,所以不能再使用它们来装饰任何控制器或操作,因为在编译时必须知道属性值。您需要一种机制将这些过滤器在运行时应用于控制器/操作。
如果您使用的是ASP.NET MVC 3,则可以编写一个custom filter provider,它会将操作过滤器应用于所需的控制器/操作,方法是将依赖项注入其中。
如果您使用的是旧版本,则可以使用custom ControllerActionInvoker。