NLayers架构-用户会话是横切组件吗?我们如何实现它



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

Domain必须在考虑Users权限的情况下实现所有业务逻辑。现在我的问题是,Domain如何知道用户会话以及哪个用户正在调用他的服务?

我的域服务接口(或契约)在他所有的方法将包括"UserId"输入参数提供的表示层(域应该是信任的表示层):

  • GetProfileInfo (userId)
  • GetUserPendingOrders (userId)

或. .用户会话应该是一个横切组件吗?如果是这样,domain将知道哪个用户正在调用他的服务,因此接口将是:

  • GetProfileInfo ()
  • GetUserPendingOrders ()

我们如何实现它?是否存在某种设计模式?

是否必须在Storage中保存用户会话?还是有别的办法?

在经典的基于web的环境中,用户会话是只有web服务器知道的事情。

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

这同样适用于其他类型的应用程序(WinForms等)。

UserId的概念与用户会话无关;当然,用户可能会使用系统(创建一个新会话),并且您可能能够将两者联系在一起。(你上面的例子让我怀疑你是否把他们弄混了)。

它是一个横切关注点吗?

如果您将User Session建立为正式的域对象-那么答案是"是",因为域对象(或它们所代表的概念)是横切的,但与日志或错误处理不同。

否则,如果用户会话只不过是(例如)基于web服务器的会话,那么答案是"否",这是一个特定于表示层的概念-在web服务器上运行。

然后还有第三种选择,一种中途之家:您可以传递用户SessionID,就像您传递任何其他原始数据一样-但永远不会真正拥有用户会话域对象。这里你要小心;例如,一种web服务器可能使用GUID,另一种可能使用int或string -所以要小心你怎么做。

相关内容

最新更新