gpt4 book ai didi

dependency-injection - 可以从 ASP.NET Core 项目中的 Simple Injector 注入(inject) IAsyncActionFilter 吗?

转载 作者:行者123 更新时间:2023-12-01 15:54:14 26 4
gpt4 key购买 nike

考虑一个 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();
}
}

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

如果我添加 IServiceCollection注册相同类型,它确实被注入(inject)到 Action 过滤器中。虽然我不想要两个绑定(bind),但我试图避免使用框架容器并坚持使用 Simple Injector。

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

最佳答案

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

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

另一种选择是在内置配置系统中创建一个代理过滤器,该过滤器委托(delegate)给从 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));
});

这对全局过滤器很有用。当涉及到 Controller 或 Action 范围的过滤器时,请查看 passive attributes .

关于dependency-injection - 可以从 ASP.NET Core 项目中的 Simple Injector 注入(inject) IAsyncActionFilter 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43567693/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com