如何使用Windsor将依赖项注入ActionFilterAttributes

时间:2009-02-16 13:39:10

标签: asp.net-mvc dependency-injection castle-windsor

看过NInject can do itAutoFac can do it我是如何试图找出如何使用Castle Windsor将依赖项注入MVC​​ ActionFilters

目前我正在使用一个丑陋的静态IoC帮助程序类来解析构造函数代码中的依赖关系,如下所示:

public class MyFilterAttribute : ActionFilterAttribute
{    
  private readonly IUserRepository _userRepository;
  public MyFilterAttribute() : this(IoC.Resolve<IUserRepository>()) { }
  public MyFilterAttribute(IUserRepository userRepository)
  {
     _userRepository = userRepository;
  }
}

我想从我的过滤器中删除静态反模式IoC的东西。

任何暗示我将如何与Castle Windsor一起做这件事?

不,改变DI框架不是一种选择。

2 个答案:

答案 0 :(得分:18)

当我需要这个时,我建立了其他人对Ninject和Windsor所做的工作,以获得property injection dependencies on my ActionFilters

答案 1 :(得分:10)

创建一个通用属性:MyFilterAttribute,ctor将Type作为参数 - 例如:

public class MyFilterAttribute : ActionFilterAttribute {
    public MyFilterAttribute(Type serviceType) {
        this.serviceType = serviceType;
    }

    public override void OnActionExecuting(FilterExecutingContext c) {
        Container.Resolve<IFilterService>(serviceType).OnActionExecuting(c);
        // alternatively swap c with some context defined by you
    }

    // (...) action executed implemented analogously

    public Type ServiceType { get { return serviceType; } }
    public IWindsorContainer Container { set; get; }
}

然后使用与您引用的两篇文章相同的方法,以控制如何调用操作,并手动将WindsorContainer注入属性。

使用方法:     [MyFilter(typeof运算(IMyFilterService))]

然后你的实际过滤器将在一个实现IMyFilterService的类中,而后者应该实现IFilterService,它看起来像这样:

public interface IFilterService {
    void ActionExecuting(ActionExecutingContext c);
    void ActionExecuted(ActionExecutedContext c);
}

这样你的过滤器甚至不会绑定到ASP.NET MVC,你的属性只是一块元数据 - 它实际上应该是这样的! : - )