我一直在尝试使用经过身份验证的用户提供的值修改注入的服务。
使用内置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
当程序执行请求时,我的控制器中注入的存储库不会预先保存已保存的值。
我做错了吗? 根据我的理解,范围内的对象保存在请求中。
另外,还有另一种方法可以达到这个目的吗?
答案 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>();