Spring.Net&属性注入

时间:2011-07-03 10:02:30

标签: asp.net-mvc dependency-injection spring.net

我想使用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");
    }
    ....

1 个答案:

答案 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