【发布时间】:2021-05-07 03:59:36
【问题描述】:
我想创建一个新的 DI 范围来更改服务注册,我有几个需要它的用例,例如我曾经使用过 ICurrentPrincipalAccessor、ThreadPrincipalAccessor 和 HttpContextPrincipalAccessor 的两个实现ThreadPrincipalAccesor 用于控制台,HttpContextPrincipalAccesor 用于 ASP.NET。在我注入 ICurrentPrincipalAccesor 的库类中,直到我需要从 ASP.NET 应用程序中的托管服务访问主体时,我才遇到问题。
由于它是我注册的 ASP.NET 应用程序:
services.AddTransient<ICurrentPrincipalAccessor, HttpContextPrincipalAccesor>();
然后在托管服务中创建一个子范围:
using (var scope = _serviceProvider.CreateScope())
{
var service = scope.ServiceProvider.GetService<MyGreatServiceWhatDoSomethingWithPrincipal>();
service.DoSomething();
}
MyGreatServiceWhatDoSomethingWithPrincipal 有一个 ICurrentPrincipalAccessor 依赖项和 HttpContextPrincipalAccesor 被注入,但在这种情况下,从托管服务调用,我想注入 ThreadPrincipalAccessor,我想做一些类似的事情:
using (var scope = _serviceProvider.CreateScope(collectionService => {
// Define here the new scope service configurations
collectionService.AddTransient<ICurrentPrincipalAccessor, ThreadPrincipalAccesor>();
}))
{
var service = scope.ServiceProvider.GetService<MyGreatServiceWhatDoSomethingWithPrincipal>();
service.DoSomething();
}
是的,我可以访问HttpContext.User,如果它是空访问Thread.CurrentPrincipal,好的!但在更多用例中,我想更改子范围的服务配置。
你能帮帮我吗?
另一方面,我使用 Autofac 作为 IoC 容器,也许我可以用 Autofac 做一些特定的事情。
【问题讨论】:
-
见answer。类似的解决方案适用于您的情况,或者您将
IHttpContextAccessor注入SwitchableBus(即CurrentPrincipalAccessorProxy)的变体。
标签: asp.net-core .net-core dependency-injection