mat*_*350 3 c# asp.net-core-mvc asp.net-core asp.net-core-2.0
我在IActionContextAccessor使用 asp.net core 的内置 DI 容器时遇到了一些问题。IActionContextAccessor.ActionContext每次请求时该属性为空。我正在尝试IActionContextAccessor像这样注册:
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>( );
services.TryAddScoped<ITenantProvider, TenantProvider>( );
Run Code Online (Sandbox Code Playgroud)
我正在尝试访问ActionContextAccessor.ActionContext这里
public TenantProvider( SomeTenantsDbContext context, IActionContextAccessor accessor )
{
var alias = accessor?.ActionContext?.RouteData?.Values["tenant"]?.ToString();
if(alias != null)
{
_tenantId = context.Tenants.FirstOrDefault( t => t.Alias == alias )?.Id;
}
}
Run Code Online (Sandbox Code Playgroud)
这可能是什么原因。欢迎所有建议
看起来您IActionContextAccessor.ActionContext在TenantProvider. 这通常会导致您遇到的问题,因为TenantProvider可能会在IActionContextAccessor.ActionContext尚未设置为当前执行的操作时被实例化。
我建议您将构造函数中的逻辑移动到某种方法TentantProvider并从控制器调用它。例如:
private readonly SomeTenantsDbContext _context;
privat readonly IActionContextAccessor _accessor;
public TenantProvider(SomeTenantsDbContext context, IActionContextAccessor accessor )
{
_context = context;
_accessor = accessor;
}
public void DoStuuff()
{
var alias = _accessor?.ActionContext?.RouteData?.Values["tenant"]?.ToString();
if(alias != null)
{
var tenantId = _context.Tenants.FirstOrDefault( t => t.Alias == alias)?.Id;
// Do something with tenant id
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |