Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 访问域对象中的会话_Domain Driven Design_Cqrs_Event Sourcing - Fatal编程技术网

Domain driven design 访问域对象中的会话

Domain driven design 访问域对象中的会话,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我们在我们的应用程序中使用事件源,并且严格需要跟踪对我们的许多对象发起更改的用户。目前我们有这样的代码 class Order { setNameBy(newname, User user) { applyChange(new OrderRenamed(user.id, newname)); } : } 因为我们的大多数方法都是这样的,所有的方法都是这样调用的 setNameBy("a new name", SessionContext.currentUser) 我们正

我们在我们的应用程序中使用事件源,并且严格需要跟踪对我们的许多对象发起更改的用户。目前我们有这样的代码

class Order { 
  setNameBy(newname, User user) {
    applyChange(new OrderRenamed(user.id, newname));
  }
  :
}
因为我们的大多数方法都是这样的,所有的方法都是这样调用的

setNameBy("a new name", SessionContext.currentUser)
我们正在考虑访问域对象内部的SessionContext。i、 e:

setNameBy(newname, User user) {
  applyChange(new OrderRenamed(user.id, newname));
}
变成

setName(newname) {
  applyChange(new OrderRenamed(SessionContext.currenUser.id, newname));
}
我个人更喜欢后面的方法签名,因为它更自然。另一方面,访问域对象内部的SessionContext感觉有点混乱


那么,在DDD/CQRS应用程序中,如何最好地处理这样的会话数据呢?。访问域对象中的SessionContext可以吗?还是应该使用其他方法(如事件充实)将此信息添加到从域发出的事件中?

我宁愿让域模型完全不知道外部细节。如果您的域对象需要用户id来强制执行业务规则,我将使用您当前的方法并将用户作为参数发送。如果您只需要用于跟踪/审核目的的用户id,您可以丰富事件。

我更喜欢让我的域模型完全不知道外部细节。如果您的域对象需要用户id来强制执行业务规则,我将使用您当前的方法并将用户作为参数发送。如果仅出于跟踪/审核目的而需要用户id,则可以丰富事件内容。

如果频繁跟踪发起更改的用户,则SessionContext将成为解决方案的固有部分,因此是阻力最小的路径(足够好的解决方案)。也许重写UserContext会让它听起来不像是一个“肮脏”的技术耦合

我经常在我的应用程序中使用线程绑定上下文(事件源上下文和非事件源上下文),如果您的SessionContext.currentUser在SessionContext未绑定到线程时引发异常,那么它还可以帮助您在测试期间发现错误(至少对我来说是这样)

另一种方法是将事件标记为需要用户跟踪(例如使用界面),然后在事后充实事件。这让我觉得有点麻烦,可能会使问题解决变得更困难,因为在需要用户信息的业务功能之外,会发生未绑定的SessionContext异常


这两种解决方案都是IMO足够好的解决方案,因此主要是希望在何处耦合到SessionContext的问题。

如果跟踪发起更改的用户经常发生,则SessionContext将成为解决方案的固有部分,因此IMO是阻力最小的路径(足够好的解决方案)。也许重写UserContext会让它听起来不像是一个“肮脏”的技术耦合

我经常在我的应用程序中使用线程绑定上下文(事件源上下文和非事件源上下文),如果您的SessionContext.currentUser在SessionContext未绑定到线程时引发异常,那么它还可以帮助您在测试期间发现错误(至少对我来说是这样)

另一种方法是将事件标记为需要用户跟踪(例如使用界面),然后在事后充实事件。这让我觉得有点麻烦,可能会使问题解决变得更困难,因为在需要用户信息的业务功能之外,会发生未绑定的SessionContext异常

这两种解决方案都是足够好的解决方案,因此主要是希望在何处耦合到SessionContext的问题