And*_*ndy 2 c# dependency-injection .net-core asp.net-core
在我的 asp.net core 3.1 应用程序中,我有一个 RequestInfo 类,其中包含有关当前请求的信息,我想通过依赖注入将 RequestInfo 的实例提供给中间件和控制器。很明显,RequestInfo 必须为每个请求构造,并且需要 HttpContext 来构造它。我正在注册这样的临时服务:
services.AddTransient<RequestInfo>(sp =>
{
var context = sp.GetService<HttpContext>();
return new RequestInfo(context)
});
Run Code Online (Sandbox Code Playgroud)
问题是我的工厂被调用时,服务提供者中没有HttpContext。
我试过addScoped,我也试过把services.AddHttpContextAccessor();我的 ConfigureServices放在顶部,然后调用sp.GetService<HttpContextAccessor>().HttpContext工厂,但这些都不起作用。
所以我要问的是,有没有一种方法可以指定在服务提供者已经注入 HttpContext 之前不调用我的服务工厂。
我意识到还有其他方法:我可以注入一个 RequestInfoFactory,然后让消费者调用 GetRequestInfo,或者我可以使用中间件来构造 RequestInfo 并将其添加到 context.Items 中。我只是想知道是否有办法直接注入 RequestInfo,因为这对我来说似乎更清晰。
不是从 DI 容器中获取HttpContext,而是IHtttpContextAccessor从 DI 容器中获取服务(HttpContext从启动类中传递 没有任何意义):
services.AddHttpContextAccessor();
services.AddTransient<RequestInfo>(sp =>
{
var context = sp.GetService<IHttpContextAccessor>();
return new RequestInfo(context)
});
Run Code Online (Sandbox Code Playgroud)
您也可以通过引入interfacefor 来简化这个问题RequestInfo:
public interface IRequestInfo
{
}
public class RequestInfo
{
private readonly IHttpContextAccessor _httpContext;
public RequestInfo(IHttpContextAccessor httpContext)
{
_httpContext = httpContext;
}
}
Run Code Online (Sandbox Code Playgroud)
并在ConfigureServices方法中:
services.AddHttpContextAccessor();
services.AddScoped<IRequestInfo, RequestInfo>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1737 次 |
| 最近记录: |