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

Dependency injection 使用运行时可用的信息配置注入的服务,dependency-injection,asp.net-core,asp.net-core-mvc,Dependency Injection,Asp.net Core,Asp.net Core Mvc,我一直在尝试使用经过身份验证的用户提供的值修改注入的服务 使用内置DI容器,我添加了具有作用域生存期的所需服务 services.AddScoped<ITodoRepository, TodoRepository>(); services.addScope(); 然后在授权和MVC中间件之间注册一个自定义中间件,以使用特定于用户的信息修改存储库 // Configure authorization middleware app.Use(async (context, next)

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

使用内置DI容器,我添加了具有作用域生存期的所需服务

services.AddScoped<ITodoRepository, TodoRepository>();
services.addScope();
然后在授权和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
//配置授权中间件
应用程序使用(异步(上下文,下一步)=>
{
var todoRepository=context.ApplicationServices.GetRequiredService();
todoRepository.UserStoreId=context.User.GetUserStoreId();
等待next.Invoke();
});
//配置MVC中间件
当程序执行请求时,控制器中注入的存储库不会预先列出保存的值

我做错什么了吗? 据我所知,作用域对象保存在请求中


另外,还有其他方法可以实现这一点吗?

您可以创建自己的服务,即
iaauthenticateduserservice
/
authenticateduserservice

IHttpContextAccessor
注入其中

public interface IAuthenticatedUserService
{
    ClaimsPrincipal User { get; }
}
然后将
iaauthenticatedUserService
注入存储库,您可以在其中访问登录的用户

当然,您也可以直接将
IHttpContextAccessor
注入存储库,并在其中访问
httpContextAccessor.HttpContext.User
,但由于存储库通常在其自己的程序集中定义,您还需要从中引用
Microsoft.AspNetCore.Http.Abstractions
包,这将导致紧密(er)耦合

但是如果您不介意这种耦合,只需将
IHttpContextAccessor
注入存储库,它们应该是限定范围的(=每个请求)或暂时的

另外,不要忘记依赖注入/控制反转咒语:“不要打电话给我们,我们打电话给你”。您试图调用“我们”(存储库)来设置值

我做错什么了吗?据我所知,作用域对象保存在请求中

我可以通过替换

context.ApplicationServices.GetRequiredService()

context.RequestServices.GetRequiredService();
我更喜欢您的解决方案(IAuthenticatedUserService),因为它不会打破控制反转。谢谢
context.RequestServices.GetRequiredService<ITodoRepository>();