2

在ASP.NET MVC的核心项目,需要依赖考虑一个简单的动作过滤器:可能从ASP.NET Core项目中的Simple Injector注入IAsyncActionFilter?

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(); 
    } 
} 

我已经有IMyDependency用简单的注射器和其他地方工作的注册。我希望Simple Injector也能处理动作过滤器。

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

是否有一些技巧让简单注射器来处理我的动作过滤器?我记得在旧的Simple Injector化身中曾有过某种“过滤器提供者”的概念,允许这样做。

回答

5

此时,ASP.NET Core MVC的Simple Injector集成包中没有任何内容简化了使用过滤器属性的工作。我们还在为hoping微软将添加简化框架以支持非构造函数(因为微软答应make integration as smooth as it can be),但这似乎是lost cause

有几个解决方案。一种方法是交叉布线,就像你已经做过的那样。但是,越多交叉线越多,您将控制移出Simple Injector的次数越多,并且您失去Simple Injector提供的验证功能的次数越多。当所有的对象图都是单例时,这通常不会成为问题,但这是一个不同的讨论。

另一种选择是在内置配置系统中创建一个代理过滤器,该代理过滤器委托从Simple Injector中解析出的实际过滤器。

public sealed class SimpleInjectiorAsyncActionFilterProxy<TAsyncActionFilter> 
    : IAsyncActionFilter 
    where TAsyncActionFilter : class, IAsyncActionFilter { 
    private readonly Container container; 
    public SimpleInjectiorAsyncActionFilterProxy(Container container) { 
     this.container = container; 
    } 

    public async 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

+0

感谢您的帮助。我过于复杂的事情和被动属性是我真正想要的。 – kenchilada

相关问题