我可以在创建 MVC 控制器时将身份作为容器的一部分吗?
Cam I make Identity part of the container when creating MVC controllers?
当我的控制器使用一个将身份作为输入的对象时,我当然可以这样做:
public class MyController : ControllerBase
{
private readonly MyRepository _repository;
public MyController()
{
_repository = new MyRepository(HttpContext.User.Identity);
}
}
然而,手动构建存储库(或任何其他需要身份的对象)并不是很优雅。更好的方法是使用 IOC 容器来注入身份
有没有办法向 IOC 容器添加标识,所以我可以这样做:
public class MyController : ControllerBase
{
private readonly MyRepository _repository;
public MyController(MyRepository repository)
{
_repository = repository;
}
}
身份当然在各种对象中都有用。它可以在数据库存储库中用于添加元数据,如更新用户。或者它可以被访问另一个服务的对象用于模拟
受@Chetan 的建议启发,但有点不同,这对我有用。我在我的 Startup 中添加了这些注册:
services.AddHttpContextAccessor();
services.AddScoped<IIdentityProvider, IdentityProvider>();
第一行将使 IHttpContextAccessor 可用于注入。然后我可以像这样构建我的 IdentityProvider:
internal class IdentityProvider : IIdentityProvider
{
public IdentityProvider(IHttpContextAccessor contextAccessor)
{
Identity = contextAccessor.HttpContext?.User.Identity;
}
public IIdentity Identity { get; }
}
IIdentityProvider 随后可用于 MyRepository 和其他需要它的对象
public class MyRepository
{
private readonly IIdentity _identity;
public MyRepository(IIdentityProvider identityProvider)
{
_identity = identityProvider.Identity;
}
}
当我的控制器使用一个将身份作为输入的对象时,我当然可以这样做:
public class MyController : ControllerBase
{
private readonly MyRepository _repository;
public MyController()
{
_repository = new MyRepository(HttpContext.User.Identity);
}
}
然而,手动构建存储库(或任何其他需要身份的对象)并不是很优雅。更好的方法是使用 IOC 容器来注入身份
有没有办法向 IOC 容器添加标识,所以我可以这样做:
public class MyController : ControllerBase
{
private readonly MyRepository _repository;
public MyController(MyRepository repository)
{
_repository = repository;
}
}
身份当然在各种对象中都有用。它可以在数据库存储库中用于添加元数据,如更新用户。或者它可以被访问另一个服务的对象用于模拟
受@Chetan 的建议启发,但有点不同,这对我有用。我在我的 Startup 中添加了这些注册:
services.AddHttpContextAccessor();
services.AddScoped<IIdentityProvider, IdentityProvider>();
第一行将使 IHttpContextAccessor 可用于注入。然后我可以像这样构建我的 IdentityProvider:
internal class IdentityProvider : IIdentityProvider
{
public IdentityProvider(IHttpContextAccessor contextAccessor)
{
Identity = contextAccessor.HttpContext?.User.Identity;
}
public IIdentity Identity { get; }
}
IIdentityProvider 随后可用于 MyRepository 和其他需要它的对象
public class MyRepository
{
private readonly IIdentity _identity;
public MyRepository(IIdentityProvider identityProvider)
{
_identity = identityProvider.Identity;
}
}