【问题标题】:Possible to inject into IAsyncActionFilter from Simple Injector in ASP.NET Core project?可以从 ASP.NET Core 项目中的 Simple Injector 注入 IAsyncActionFilter 吗?
【发布时间】:2017-04-23 05:19:44
【问题描述】:

考虑在 ASP.NET Core MVC 项目中使用依赖项的简单操作过滤器:

public class TestActionFilter : IAsyncActionFilter {
    private readonly IMyDependency _dep;

    public class TestActionFilter(IMyDependency dep)
    {
        _dep = dep;
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context,
                                             ActionExecutionDelegate next)
    {
        // do things with _dep...
        await next();
    }
}

我已经在 Simple Injector 注册了 IMyDependency 并在其他地方工作。我希望 Simple Injector 也能处理动作过滤器。

如果我为同一类型添加IServiceCollection 注册,它会被注入到操作过滤器中。虽然我不想要两个绑定,但我试图避免使用框架容器并坚持使用 Simple Injector。

有什么技巧可以让 Simple Injector 处理我的动作过滤器吗?我记得在旧的 Simple Injector 化身中曾经有某种“过滤器提供程序”概念允许这样做。

【问题讨论】:

    标签: dependency-injection asp.net-core asp.net-core-mvc simple-injector


    【解决方案1】:

    目前,用于 ASP.NET Core MVC 的 Simple Injector 集成包中没有任何内容可以简化过滤器属性的使用。我们仍然hoping 表示,微软将在框架中添加简化以支持不合格者(因为微软承诺make integration as smooth as it can be),但这似乎是lost cause

    有几个解决方案。一种方法是交叉布线,就像您已经做过的那样。但是你越是交叉线,你越是把控制移出简单注射器,你就越失去简单注射器提供的验证能力。当您的所有对象图都是 singletons 时,这通常不会有太大问题,但这是一个不同的讨论。

    另一种选择是在内置配置系统中创建一个代理过滤器,该代理过滤器委托给从 Simple Injector 解析的真实过滤器。这样的代理可以定义如下:

    public sealed class SimpleInjectiorAsyncActionFilterProxy<TAsyncActionFilter>
        : IAsyncActionFilter
        where TAsyncActionFilter : class, IAsyncActionFilter {
        private readonly Container container;
        public SimpleInjectiorAsyncActionFilterProxy(Container container) {
            this.container = container; 
        }
    
        public Task OnActionExecutionAsync(
            ActionExecutingContext c, ActionExecutionDelegate n) =>
            container.GetInstance<TAsyncActionFilter>().OnActionExecutionAsync(c, n);
    }
    

    这是您使用此代理连接过滤器的方式:

    container.Register<TestActionFilter>();
    
    services.AddMvc(options =>
    {
        options.Filters.Add(
            new SimpleInjectiorAsyncActionFilterProxy<TestActionFilter>(container));
    });
    

    这对全局过滤器非常有用。当涉及到控制器或动作范围的过滤器时,请查看passive attributes

    【讨论】:

    • 感谢您的帮助。我把事情复杂化了,而被动属性才是我真正想要的。
    • 出于好奇史蒂文,这仍然存在吗?
    • 是的。没有任何改变。
    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2019-08-08
    • 2016-12-19
    • 2017-06-18
    相关资源
    最近更新 更多