当我的控制器使用一个以身份作为输入的对象时,我当然可以这样做:
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建议的启发,但有点不同,这对我来说很有效。我添加了这些注册在我的启动:
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;
}
}