Session NLayers架构-用户会话是否为横切组件?我们如何实施它?

Session NLayers架构-用户会话是否为横切组件?我们如何实施它?,session,architecture,dns,layer,Session,Architecture,Dns,Layer,假设我们有N层体系结构(例如:表示、域、持久性)。 表示层是Web应用程序,但我们必须记住,我们可能希望为另一个表示层(如Web服务或窗口应用程序)重用域和持久性 域必须实现所有业务逻辑,并考虑用户权限。现在我的问题是,域如何知道用户会话,谁是调用其服务的用户 我的域服务接口(或契约)在所有his方法中都将包括表示层提供的“UserId”输入参数(域应为表示层中的信任): GetProfileInfo(用户ID) GetUserPendingOrders(用户ID) 或者。。用户会话是否应该

假设我们有N层体系结构(例如:表示、域、持久性)。 表示层是Web应用程序,但我们必须记住,我们可能希望为另一个表示层(如Web服务或窗口应用程序)重用域和持久性

域必须实现所有业务逻辑,并考虑用户权限。现在我的问题是,域如何知道用户会话,谁是调用其服务的用户

我的域服务接口(或契约)在所有his方法中都将包括表示层提供的“UserId”输入参数(域应为表示层中的信任):

  • GetProfileInfo(用户ID)
  • GetUserPendingOrders(用户ID)
或者。。用户会话是否应该是横切组件?如果是,域将知道哪个用户正在调用他的服务,因此接口将是:

  • GetProfileInfo()
  • GetUserPendingOrders()
我们如何实施它?是否存在一些设计模式


我们必须在存储器中保存用户会话吗?或者还有其他方法吗?

传统的基于web的上下文中的用户会话只有web服务器知道

您可以在应用程序中拥有用户会话的概念(作为另一种域对象,具有自己的数据存储库等),但您只需要小心,不要以任何方式将其绑定/紧密耦合到会话的web服务器概念

其他类型的应用程序(WinForms等)也是如此

用户ID的概念与用户会话无关;当然,用户可能会使用该系统(创建一个新会话,您可以将这两件事联系在一起。(您上面的示例让我怀疑您是否混淆了它们)

这是一个跨领域的问题吗?

如果将用户会话建立为正式的域对象,那么答案是“是”,因为域对象(或它们所代表的概念)是横切的,但与日志记录或错误处理不同

否则,如果用户会话仅仅是(例如)基于web服务器的会话,那么答案是“否”,这是一个特定于表示层的概念—在web服务器上运行

还有第三种选择,有点像中途之家:你可以像传递任何其他原始数据块一样传递用户会话ID,但实际上从来没有用户会话域对象。在这里,你只需要小心;例如,一种web服务器可能使用GUID,另一种可能使用int或字符串-因此你走的时候要小心