Dependency injection 使用来自请求的信息添加临时服务
我在asp.net内核中有一个应用程序,它使用内置的DI框架。我想向提供者添加一个每个请求(即瞬态)服务,但我想在其构造中实际使用请求Dependency injection 使用来自请求的信息添加临时服务,dependency-injection,asp.net-core,Dependency Injection,Asp.net Core,我在asp.net内核中有一个应用程序,它使用内置的DI框架。我想向提供者添加一个每个请求(即瞬态)服务,但我想在其构造中实际使用请求 services.AddTransient<IMyService>(provider => { ... }); services.AddTransient(provider=>{…}); 这是我能找到的最接近的重载,但是提供程序对象没有关于当前请求的任何内容。有没有一种方法可以在不升级到更健壮的DI框架的情况下实现我的目标?如评论中所述,如
services.AddTransient<IMyService>(provider => { ... });
services.AddTransient(provider=>{…});
这是我能找到的最接近的重载,但是
提供程序
对象没有关于当前请求的任何内容。有没有一种方法可以在不升级到更健壮的DI框架的情况下实现我的目标?如评论中所述,如果您只需要HttpContext
的话,您可以将IHttpContextAccessor
注入您的服务并访问它
public class MyService : IMyService
{
private readonly HttpContext context;
public MyService(IHttpContextAccessor httpContextAccessor)
{
if(IHttpContextAccessor==null)
throw new ArgumentNullException(nameof(httpContextAccessor));
context = httpContextAccessor.HttpContext;
}
}
但是,如果您需要仅在控制器中或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;
}
}
公共类MyServiceFactory:IMyServiceFactory
{
//注入HttpContext以实现请求范围的服务解析
公共MyServiceFactory(IHttpContextAccessor httpContextAccessor){…}
公共IMyService Create(IDependency1 dep1,IDependency2 dep2,string someRuntimeConfig)
{
IServiceProvider provider=this.context.RequestServices;
var myService=newmyservice(provider.GetService(),dep1,dep2,someRuntimeConfig);
返回myService;
}
}
然后将
IMyServiceFactory
注入到您需要IMyService
的类中。对于每个请求服务,您使用AddScope
而不是AddTransient
AddTransient
将为每个解决方案创建一个新实例,即,如果您使用相同的存储库注入两个服务,则两个服务都将获得自己的存储库实例,而不是请求期间的共享实例。您能否指定您在服务中确切需要什么?HttpContext
?还是别的什么HttpContext
可以轻松注入,获取其他内容可能有点困难。我相信HttpContext
应该足够了,你完全正确,我的意思是使用AddScoped
而不是AddTransient
。我现在是AFK,但是AddScoped
是否有我要查找的重载?您可以使用IHttpContextAccessor获取HttpContext。@gzak:没有,但我打算建议与Pawel相同。您的IMyService
实现只需将IHttpContextAccessor
注入到它的构造函数中即可。如果您需要的不仅仅是IHttpContextAccessor
,则需要创建一个工厂类,并将控制器内的参数或操作传递给工厂方法,然后使用所需的请求参数在那里创建依赖关系