我可以在创建 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;
    }
}