使用运行时可用的信息配置注入的服务

时间:2016-02-24 10:06:43

标签: dependency-injection asp.net-core asp.net-core-mvc

我一直在尝试使用经过身份验证的用户提供的值修改注入的服务。

使用内置DI容器,我添加了Scoped生命周期所需的服务。

services.AddScoped<ITodoRepository, TodoRepository>();

然后在授权和MVC中间件之间注册了一个自定义中间件,以使用用户特定信息修改存储库。

// Configure authorization middleware

app.Use(async (context, next) =>
{
     var todoRepository = context.ApplicationServices.GetRequiredService<ITodoRepository>();
     todoRepository.UserStoreId = context.User.GetUserStoreId();
     await next.Invoke();
 });

 // Configure MVC middleware

当程序执行请求时,我的控制器中注入的存储库不会预先保存已保存的值。

我做错了吗? 根据我的理解,范围内的对象保存在请求中。

另外,还有另一种方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:2)

您可以创建自己的服务,即IAuthenticatedUserService / AutheticatedUserService

进入它,你注入IHttpContextAccessor

public interface IAuthenticatedUserService
{
    ClaimsPrincipal User { get; }
}

然后将IAuthenticatedUserService注入您的存储库,您可以在其中访问已登录的用户。

当然,您也可以直接将IHttpContextAccessor注入您的存储库并访问其中的httpContextAccessor.HttpContext.User,但由于存储库通常在自己的程序集中定义,因此您还需要引用{{1来自它的包会导致紧密的(呃)耦合。

但如果您不介意这种耦合,只需将Microsoft.AspNetCore.Http.Abstractions注入您的存储库,它们应该是作用域(=每个请求)或瞬态。

P.S。不要忘记依赖注入/控制反转口号:“不要打电话给我们,我们称呼你”。您试图调用“我们”(存储库)来设置值。

答案 1 :(得分:0)

  

我做错了吗?根据我的理解,范围内的对象保存在请求中。

我能够通过替换

解决问题

context.ApplicationServices.GetRequiredService<ITodoRepository>();

context.RequestServices.GetRequiredService<ITodoRepository>();