洋葱架构-需要基础架构信息的领域模型方法

时间:2020-08-18 11:47:06

标签: c# entity-framework design-patterns domain-driven-design onion-architecture

我刚开始使用DDD并实现了洋葱架构。

我正在创建一个邀请系统,超级用户可以在其中通过电子邮件将另一个用户邀请到他的公司。但是,在创建邀请时,我想确保用户尚未在系统中创建。我想通过检查数据库中是否有该电子邮件的记录来做到这一点。我正在使用Entity Framework处理数据库上下文。

我已经为邀请函和UserAccount建立了一个存储库,其中包含根据ID查找项目的方法。

我需要使用数据库上下文来查看邀请是否仍然有效,但是由于该方法是在域层中声明的,因此我无法在不破坏设计模式的情况下真正弄清楚如何做到这一点。域层应该对持久层一无所知。

enter image description here

我考虑过注入IUserAccountRepository,然后执行所需的方法以完成Accept()方法,但我对此感到非常遗憾。

2 个答案:

答案 0 :(得分:0)

“域”层对持久层一无所知。

是的-域层不应该知道持久性。

但是该约束不适用于应用层

换句话说,我们设计域模型接口,以便它“询问”我们(可能)成功计算模型的下一个状态所需的信息,并且应用程序存在弄清楚该信息在何处的问题。来自。

public UserAccount Accept(Guid userId, Boolean userExistsInDatabase)

您将在某些设计中看到的是,我们将传递问题的能力,而不是传递问题的答案,而是让模型自行决定是否应询问问题以及应回答什么问题。与答案有关

public UserAccount Accept(Guid userId, Roster roster)

在这种情况下,Roster是您的模型定义的接口,它接受模型已经拥有的一些信息,并报告模型可以理解的其他信息。然后,您的应用程序将在调用该方法时提供此接口的实现。

Passing values across the boundaries有点“纯粹”,因为模型代码不需要了解任何有关花名册的失败模式的信息-代替所有 代码在应用程序层中。

答案 1 :(得分:0)

可以在域服务中使用合同。

“ IUserAccountRepository”是我们在域中创建的合同,而域服务不知道实现。

所以不要担心这是正确的