Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 使用来自请求的信息添加临时服务_Dependency Injection_Asp.net Core - Fatal编程技术网

Dependency injection 使用来自请求的信息添加临时服务

Dependency injection 使用来自请求的信息添加临时服务,dependency-injection,asp.net-core,Dependency Injection,Asp.net Core,我在asp.net内核中有一个应用程序,它使用内置的DI框架。我想向提供者添加一个每个请求(即瞬态)服务,但我想在其构造中实际使用请求 services.AddTransient<IMyService>(provider => { ... }); services.AddTransient(provider=>{…}); 这是我能找到的最接近的重载,但是提供程序对象没有关于当前请求的任何内容。有没有一种方法可以在不升级到更健壮的DI框架的情况下实现我的目标?如评论中所述,如

我在asp.net内核中有一个应用程序,它使用内置的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
,则需要创建一个工厂类,并将控制器内的参数或操作传递给工厂方法,然后使用所需的请求参数在那里创建依赖关系