当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用Windsor将依赖项注入ActionFilterAttributes》经验,为你挑选了2个好方法。

看过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框架不是一种选择.



1> PatrickSteel..:

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


我也喜欢该链接的方法.

2> mookid8000..:

创建一个通用属性: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,你的属性只是一块元数据 - 它实际上应该是这样的!:-)


我同意:属性不应该是"可执行的",而只是一个标签.
非常感谢您的回答!我运行了几个mod:1)Container.Resolve行需要一个通用参数.我将其更改为使用Container.Resolve(serviceType)并强制转换它.2)我继承了mvccontrib WindsorControllerFactory并在CreateController()中添加了ActionInvoker.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有