域逻辑 - 读模型

时间:2015-12-15 12:21:58

标签: java c# domain-driven-design cqrs event-sourcing

我有两个聚合。

Person {
    private personID personID;
    private nodeID nodeID; //belongs to node
}
Node {
    private nodeID nodeID; //node's id
    private nodeID parent; //parent node reference by id

    public void assign(Person person);
}

现在,我的人员分配服务的域逻辑: 只有属于节点"X"的节点"Y"才能将人员分配给节点"X",节点Read Model是父节点或曾祖父或曾祖父或节点Read Model

要找出它,我需要查询<!-- jQuery datepicker script --> <script> $(function () { var date = new Date(); var currentMonth = date.getMonth(); var currentDate = date.getDate(); currentDate = currentDate; var currentYear = date.getFullYear(); $('#datepicker1').datepicker( { dateFormat: "yy-mm-dd", minDate: new Date(currentYear, currentMonth, currentDate), beforeShowDay: $.datepicker.noWeekends }); }); </script> <!-- test code for date / no date needed options --> <form method="POST" action="insert_sql_row.php"> <b>Pick date:</b> <input type="text" id="datepicker1" name="date_entry" maxlength="10" size="10" /> <b>OR No Date Needed: </b> <input type="checkbox" name="checkbox1" value="1"> <input type="submit" name="Submit1" value="Submit form"></td></tr>'); </form> 。 我在Domain中,所以我不能只使用我的Read Model来查询它。 我不认为我可以添加到我的存储库,连接到读取模型,因为它连接到我的事件存储。特别是,当private var liveFeedLoader:URLLoader = new URLLoader(); private var feedUpdateTimer:Timer = new Timer(30000); private function init(e:Event):void { liveFeedLoader.addEventListener(IOErrorEvent.IO_ERROR, liveFeedLoaderErrFx); liveFeedLoader.addEventListener(Event.COMPLETE, liveFeedLoaderFx); feedUpdateTimer.addEventListener(TimerEvent.TIMER, checkForUpdate); liveFeedLoader.load(new URLRequest("https://s3-us-west-2.amazonaws.com/abcd/XYZ.xml")); feedUpdateTimer.start(); } 可以放在另一个服务器上并且是另一个应用程序时。

实施它的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

以下是禁令:

  

只有当他属于节点&#34; Y&#34;才能将人员分配到节点&#34; X&#34;   父母或曾祖父或曾曾祖父或......   节点&#34; X&#34;。

如果是必须强制执行的约束,则可以在写入方的单独聚合中对层次结构建模(例如,Graph),其唯一目的是确保完整性。

答案 1 :(得分:0)

执行此操作的正确方法是支持命令模型中的祖先检查 。这是您要强制执行不变量的地方,因此模型需要支持此功能。

如果您需要能够进行无限制的祖先检查,树结构通常会导致性能问题。因此,您可能需要实现性能优化,以改进这些类型的查询。

我看到以下可能性:

  • 使用直接支持所需查询的数据存储。如果你想做ES,这可能很难。
  • 使用快照。根据您的树形结构,这可能是也可能不可行。
  • 使用缓存。这类似于快照,但将信息存储在缓存中而不是存储在事件存储中。
  • 使用读取模型。确保您了解其后果,尤其是异步数据传播和增加的复杂性。我只是建议这是最后的手段,但YMMV。