加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何使用Windsor将依赖项注入到ActionFilterAttr

发布时间:2020-12-16 00:35:43 所属栏目:asp.Net 来源:网络整理
导读:看过如何 NInject can do it和 AutoFac can do it我试图找出如何注入依赖项到MVC ActionFilters使用城堡温莎 目前,我正在使用一个丑陋的静态IoC帮助器类来解析构造函数代码的依赖关系,如下所示: public class MyFilterAttribute : ActionFilterAttribute{
看过如何 NInject can do it和 AutoFac can do it我试图找出如何注入依赖项到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框架不是一个选择。

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读