首页 > 解决方案 > Unity 构造函数注入作为运行时参数

问题描述

我正在使用 Unity 作为 DI 容器构建 Web API(存储库模式)。

我的服务正在使用一个接受登录用户 ID 作为参数的存储库。此用户 ID 参数应来自 http 请求的标头。

我的仓库:

public class UserRepository : IUserRepository
{
    private readonly UserInformationObj _userInformation;

    public UserRepository(Guid currentUserId)
    {       
        _userInformation = LoadUserData(currentUserId.ToString());
    }
}

统一配置:

container.RegisterType<IUserRepository, UserRepository>(new InjectionConstructor(Guid.Empty));

我如何从统一的 HTTP Header 中获取值?

不确定这是否相似https://stackoverflow.com/a/11995346/1169180。我不明白解决方案。谁能快速指导我到底需要做什么?

谢谢。

标签: c#dependency-injectionunity-container

解决方案


关键是你有两个阶段unity-container,注册和解决。由于您在注册期间不知道 的值,因此Guid您应该InjectionConstructor从注册中删除。

container.RegisterType<UserRepository>();

另一方面,您确实知道Guid在解决过程中,它来自请求。所以这个想法是解决IUserRepository并注入Guid那里。这意味着对于每个请求,您都将解析存储库的一个新实例并将其值Guid注入其中......

guid = Guid.Parse(request.Headers["CurrentUserId"])
var rep = _container.Resolve<UserRepository>(new ParameterOverride("currentUserId", guid));

推荐阅读