17

看到NInject 如何做到这一点并且AutoFac 可以做到这一点后,我试图弄清楚如何使用 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 的东西。

关于我将如何与温莎城堡一起做这件事的任何提示?

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

4

2 回答 2

18

当我需要这个时,我在其他人使用 Ninject 和 Windsor 所做的工作的基础上,获得对我的 ActionFilters 的属性注入依赖项

于 2009-11-06T12:41:11.617 回答
11

制作一个通用属性: 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,并且您的属性只是一段元数据——它实际上应该是这样的!:-)

于 2009-02-16T14:06:56.747 回答