【问题标题】:Using Spring.Net to inject dependencies into ASP.NET MVC ActionFilters使用 Spring.Net 将依赖项注入 ASP.NET MVC ActionFilters
【发布时间】:2009-12-02 02:51:35
【问题描述】:

我正在使用 MvcContrib 进行 Spring.Net ASP.Net MVC 控制器依赖注入。 我的依赖项没有被注入到我的 CustomAttribute 操作过滤器中。 如何将我的依赖项放入其中?

假设您有一个如下所示的 ActionFilter:

public class CustomAttribute : ActionFilterAttribute, ICustomAttribute
{
    private IAwesomeService awesomeService;

    public CustomAttribute(){}

    public CustomAttribute(IAwesomeService awesomeService)
    {
          this.awesomeService= awesomeService;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         //Do some work
    }
}

使用如下所示的 Spring.Net 配置部分:

<object id="CustomAttribute " type="Assembly.CustomAttribute , Assembly" singleton="false">
    <constructor-arg ref="AwesomeService"/>
</object>

然后你像这样使用属性:

[Custom]
public FooController : Controller
{
    //Do some work
}

【问题讨论】:

    标签: asp.net asp.net-mvc spring.net mvccontrib action-filter


    【解决方案1】:

    这里的难点在于,ActionFilters 似乎会随着每个请求以及在 Spring 无法识别的上下文中被实例化。我在 ActionFilter 构造函数中使用 Spring“ContextRegistry”类处理了相同的情况。不幸的是,它在您的代码中引入了 Spring 特定的 API 使用,如果可能的话,这是一个避免的好习惯。

    这是我的构造函数的样子:

    public MyAttribute()
    {
        CustomHelper = ContextRegistry.GetContext().GetObject("CustomHelper") as IConfigHelper;
    }
    

    请记住,如果要加载多个 Spring 上下文,则需要在 GetContext(...) 方法中指定所需的上下文。

    【讨论】:

    • 这是我能够做到的唯一方法,因为大多数注入场景都是从控制器开始的。您可以在 MVC 中设置默认的 DependencyResolver 以使用基于您需要实现的 Spring ....这将使 Spring 特定代码保持在您的属性之外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多