我是DDD的新手,我正试图在现实生活中应用它.没有关于这种验证逻辑的问题,如空检查,空字符串检查等 - 直接进入实体构造函数/属性.但是在哪里验证一些全局规则,如"唯一用户名"?
所以,我们有实体用户
public class User : IAggregateRoot
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
// other data and behavior
}
Run Code Online (Sandbox Code Playgroud)
和用户存储库
public interface IUserRepository : IRepository<User>
{
User FindByName(string name);
}
Run Code Online (Sandbox Code Playgroud)
选项包括:
每个选项更详细:
1.将存储库注入实体
我可以在实体构造函数/属性中查询存储库.但我认为在实体中保持对存储库的引用是一种难闻的气味.
public User(IUserRepository repository)
{
_repository = repository;
}
public string Name
{
get { return _name; }
set
{
if (_repository.FindByName(value) != null)
throw new UserAlreadyExistsException(); …Run Code Online (Sandbox Code Playgroud) 我第一次尝试使用DDD(在.Net中),因为我正在重新设计遗留企业应用程序的一些核心组件.
我想要澄清的是,我们如何在适当的DDD架构中实现持久性?
我意识到域名本身是持久性无知的,应该使用"普遍存在的语言"进行设计,当然不会强制进入本月DAC甚至物理数据库的约束.
我是否认为存储库接口存在于域程序集中,但存储库实现是否存在于持久层中?持久层包含对Domain层的引用,反之亦然?
我的实际存储库方法(CRUD)从哪里调用?
当我尝试关注DDD时,我是否应该经常使用这些服务?
或者我可以直接使用存储库来获取域对象吗?