我使用内置的DI框架在asp.net核心中获得了一个应用程序。我想向提供商添加每请求(即瞬态)服务,但我希望在构建时实际使用该请求。
services.AddTransient<IMyService>(provider => { ... });
这是我能找到的最近的重载,但provider
对象没有关于当前请求的任何内容。有没有办法实现我尝试做的事情,而无需升级到更强大的DI框架?
答案 0 :(得分:1)
如评论中所述,如果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;
}
}
但是,如果您需要仅在控制器中或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;
}
}
然后将IMyServiceFactory
注入您需要IMyService
的课程。