我正在考虑为每个请求创建一个用户上下文。这样的事情,但感觉不对:
container.Register<UserContext>(() =>
{
var context = new UserContext();
//add runtime data...
return context;
});
然后将其注入基本服务层类以供重用。
有人能指出我更好的方向来实现这个目标吗?
提前致谢。
答案 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"];
}