gpt4 book ai didi

dependency-injection - 使用来自请求的信息的 AddTransient 服务

转载 作者:行者123 更新时间:2023-12-03 23:23:11 25 4
gpt4 key购买 nike

我在 asp.net core 中有一个使用内置 DI 框架的应用程序。我想向提供者添加一个按请求(即 transient )服务,但我想在其构造中实际使用该请求。

services.AddTransient<IMyService>(provider => { ... });

这是我能找到的最接近的过载,但是 provider object 没有关于当前请求的任何内容。有没有办法在不升级到更强大的 DI 框架的情况下实现我想要做的事情?

最佳答案

如评论中所述,您可以注入(inject) IHttpContextAccessor进入您的服务并访问它,如果 HttpContext是你唯一需要的。

public class MyService : IMyService
{
private readonly HttpContext context;

public MyService(IHttpContextAccessor httpContextAccessor)
{
if(IHttpContextAccessor==null)
throw new ArgumentNullException(nameof(httpContextAccessor));

context = httpContextAccessor.HttpContext;
}
}

但是,如果您需要仅在 Controller 中或 HttpContext 之外可用的东西,你可以创建一个工厂并将参数传递给工厂
public class MyServiceFactory : IMyServiceFactory
{
// injecting the HttpContext for request wide service resolution
public MyServiceFactory(IHttpContextAccessor httpContextAccessor) { ... }
public IMyService Create(IDependency1 dep1, IDependency2 dep 2, string someRuntimeConfig)
{
IServiceProvider provider = this.context.RequestServices;

var myService = new MyService(provider.GetService<ISomeRepository>(), dep1, dep2, someRuntimeConfig);
return myService;
}
}

然后注入(inject) IMyServiceFactory到您需要的类(class) IMyService .

关于dependency-injection - 使用来自请求的信息的 AddTransient 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36186670/

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