【问题标题】:Unity constructor injection as a runtime parameterUnity 构造函数注入作为运行时参数
【发布时间】:2019-02-07 05:29:01
【问题描述】:

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

我的服务正在使用一个接受登录用户 ID 作为参数的存储库。 这个 user-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 标头获取值?

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

谢谢。

【问题讨论】:

    标签: c# dependency-injection unity-container


    【解决方案1】:

    重点是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));
    

    【讨论】:

    • @Shaggy 您不是从统一访问它,而是从您的请求处理程序中访问它,您应该在那里注入 IUnityContainer 并为每个请求解析存储库...明白吗?
    • 我只想在 Unity 中进行解析,因为我有许多其他存储库/服务正在使用 UserRepository。根据我对每个请求的理解,统一将解析实例并使用当前用户 ID 初始化存储库。有什么办法吗?
    • 一般来说,这种魔法并不存在,因为您必须以某种方式提供Guid。还有一个选项可以通过IUserRepository 的方法提供id 而不是你可以摆脱这个?
    • 我没有收到您评论的最后一部分。你能用一些代码解释一下吗?
    • @Shaggy UserRepository 方法的签名是什么?为什么需要通过ctor而不是方法提供userId?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多