gpt4 book ai didi

domain-driven-design - 什么类型的代码适合服务层?

转载 作者:行者123 更新时间:2023-12-01 04:10:28 24 4
gpt4 key购买 nike

假设您有实体、服务层和存储库(带有像 NHibernate 这样的 ORM)。 UI 与服务层交互。

什么类型的代码适合服务层?

存储库协调?

它看起来像 entities should not reference the repository那么服务层中是否应该存在加载/保存/驱逐实体的调用?

涉及存储库的业务逻辑?

如果上述情况属实,是否应该在服务层中检查用户名是否不同(即调用 GetUsersByUsername 并检查结果)?在建议数据库应该处理不同的之前,验证密码是否在 90 天内未被使用呢?

涉及多个实体的业务逻辑?

我不确定这个,但假设您需要对可能相关或可能不相关并且并不真正适用于单个实体的一组实体应用操作。实体是否应该能够对这些集合进行操作,或者这种事情是否属于服务层?

映射?

无论您是使用 DTO 还是将实体发送到服务层或从服务层发送实体,您都可能最终会进行映射(最好使用 AutoMapper)。这属于服务层吗?

我正在寻找对上面列出的想法的确认(或拒绝),以及在使用实体/存储库时有关服务层职责的任何其他想法。

最佳答案

Repository Coordination?



聚合根应该绘制事务边界。因此 - 应该很少涉及多个存储库。如果是 - 通常发生在您是 时正在创建 新的聚合根(而不是修改其状态)。

Business Logic that Involves Repositories?



是的,检查用户名是否不同可能存在于服务层。因为 User 通常是一个聚合根,并且聚合根存在于全局上下文中(没有什么可以“持有”它们)。我个人将这种逻辑放在存储库中,或者直接通过 ORM 进行检查。

至于检查密码使用情况 - 这是用户本身的问题,应该存在于 User 对象下。像这样的东西:
class User{
void Login(){
LoggedOn=DateTime.Now;
...
}
bool HasLoggedInLast90Days(){
return (DateTime.Now-LoggedOn).Days<=90;
}
}

Business Logic that Involves Multiple Entities?



聚合根应该管理它们的实体集合。
class Customer{
void OrderProduct(Product product){
Orders.Add(new Order(product)); //<--
}
}

但请记住,聚合根不应微控制其实体。

例如。这不好:
class Customer{
void IsOrderOverdue(Order order){
return Orders.First(o=>o==order)....==...;
}
}

而是使用:
class Order{
void IsOverdue(){
return ...;
}
}

Mapping?



我想映射到 dto 的实时服务层。我的映射类位于 web 项目中查看模型类的旁边。

关于domain-driven-design - 什么类型的代码适合服务层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6455138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com