每个请求依赖注入的用户上下文

时间:2017-07-28 21:09:08

标签: c# dependency-injection simple-injector

我正在考虑为每个请求创建一个用户上下文。这样的事情,但感觉不对:

container.Register<UserContext>(() =>
{
     var context = new UserContext();
     //add runtime data...                   
     return context;
});

然后将其注入基本服务层类以供重用。

有人能指出我更好的方向来实现这个目标吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

对象图的构造应该是reliable,因此我们可以构造它们with confidence。这基本上意味着we shouldn't construct them using runtime data

HttpContext及其属性是运行时数据,并在对象图构造期间访问它:

  

会导致歧义,使组合根变得更加复杂,并且更难以验证DI配置的正确性。

解决方案是以这样的方式重构UserContext:只有在访问其成员之一(构造函数除外)时才访问HttpContext。这允许在不知道请求的情况下构造UserContext,甚至允许它成为无状态和单独的。 referenced文章展示了此类实施的一个示例:

class HttpSessionUserContext : IUserContext 
{
    public int CurrentUserId => (int)HttpContext.Session["userId"];
}