看过NInject如何做到这一点,AutoFac可以做到这一点我试图弄清楚如何使用Castle Windsor将依赖注入MVC ActionFilters
目前我正在使用一个丑陋的静态IoC助手类来解析构造函数代码中的依赖关系,如下所示:
public class MyFilterAttribute : ActionFilterAttribute { private readonly IUserRepository _userRepository; public MyFilterAttribute() : this(IoC.Resolve()) { } public MyFilterAttribute(IUserRepository userRepository) { _userRepository = userRepository; } }
我想从我的过滤器中删除静态反模式IoC的东西.
任何暗示我将如何与温莎城堡一起做这件事?
不,改变DI框架不是一种选择.
当我需要这个时,我建立在其他人用Ninject和Windsor做的工作的基础上,以获得对我的ActionFilters的属性注入依赖性.
创建一个通用属性:MyFilterAttribute,ctor将Type作为参数 - 例如:
public class MyFilterAttribute : ActionFilterAttribute { public MyFilterAttribute(Type serviceType) { this.serviceType = serviceType; } public override void OnActionExecuting(FilterExecutingContext c) { Container.Resolve(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,你的属性只是一块元数据 - 它实际上应该是这样的!:-)