gpt4 book ai didi

domain-driven-design - DDD : where should logic go that tests the existence of an entity?

转载 作者:行者123 更新时间:2023-12-04 08:22:36 24 4
gpt4 key购买 nike

我正在重构应用程序,并试图找出某些逻辑应该适合的位置。例如,在注册过程中,我必须根据用户的电子邮件地址检查用户是否存在。由于这需要测试用户是否存在于数据库中,因此该逻辑似乎不应与模型绑定(bind),因为它的存在取决于它是否存在于数据库中。

但是,我将在存储库中有一个方法负责通过电子邮件等方式获取用户。这将处理有关检索用户(如果存在)的部分。从用例的角度来看,注册似乎是一个用例场景,因此似乎应该有一个带有 register 方法的 UserService(应用程序服务),该方法将调用存储库方法并执行 if then 逻辑以确定返回的用户实体是否为是否为空。

就 DDD 而言,我是否走在正确的轨道上?我是否以错误的方式看待这种情况,如果是这样,我应该如何修改我的想法?

此链接作为可能的解决方案提供,Where to check user email does not already exits? .它确实有帮助,但似乎并没有结束这个问题的循环。我似乎从本文中遗漏的事情是,谁将负责调用 CreateUserService、应用程序服务或聚合根上的方法,其中 CreateUserService 对象将与任何其他相关参数一起注入(inject)到方法中?

如果答案是应用程序服务,您似乎通过将域服务从域层中取出而失去了一些封装。另一方面,采用另一种方式意味着必须将存储库注入(inject)到域服务中。这两个选项中的哪一个更可取并且更符合 DDD?

最佳答案

我认为最适合这种行为的是域服务。 DS 可以访问持久性,因此您可以检查是否存在或唯一性。
查看this blog entry了解更多信息。

IE:

public class TransferManager
{
private readonly IEventStore _store;
private readonly IDomainServices _svc;
private readonly IDomainQueries _query;
private readonly ICommandResultMediator _result;

public TransferManager(IEventStore store, IDomainServices svc,IDomainQueries query,ICommandResultMediator result)
{
_store = store;
_svc = svc;
_query = query;
_result = result;
}

public void Execute(TransferMoney cmd)
{
//interacting with the Infrastructure
var accFrom = _query.GetAccountNumber(cmd.AccountFrom);

//Setup value objects
var debit=new Debit(cmd.Amount,accFrom);

//invoking Domain Services
var balance = _svc.CalculateAccountBalance(accFrom);
if (!_svc.CanAccountBeDebitted(balance, debit))
{
//return some error message using a mediator
//this approach works well inside monoliths where everything happens in the same process
_result.AddResult(cmd.Id, new CommandResult());
return;
}

//using the Aggregate and getting the business state change expressed as an event
var evnt = Transfer.Create(/* args */);

//storing the event
_store.Append(evnt);

//publish event if you want
}
}

来自 http://blog.sapiensworks.com/post/2016/08/19/DDD-Application-Services-Explained

关于domain-driven-design - DDD : where should logic go that tests the existence of an entity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48200345/

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