c# - 在 DDD 方法中,这个示例是否正确建模?

标签 c# repository domain-driven-design repository-pattern

刚刚在 SO 上创建了一个 acc 来问这个 :)

假设这个简化示例:构建一个 Web 应用程序来管理项目...
该应用程序具有以下要求/规则。

1) 用户应该能够通过插入项目名称来创建项目。
2) 项目名称不能为空。
3) 两个项目不能重名。

我正在使用 4 层架构(用户界面、应用程序、域、基础架构)。
在我的应用层上,我有以下 ProjectService.cs 类:

public class ProjectService
{
    private IProjectRepository ProjectRepo { get; set; }

    public ProjectService(IProjectRepository projectRepo)
    {
        ProjectRepo = projectRepo;
    }

    public void CreateNewProject(string name)
    {
        IList<Project> projects = ProjectRepo.GetProjectsByName(name);
        if (projects.Count > 0) throw new Exception("Project name already exists.");

        Project project = new Project(name);
        ProjectRepo.InsertProject(project);
    }
}

在我的域层上,我有 Project.cs 类和 IProjectRepository.cs 接口(interface):

public class Project
{
    public int ProjectID { get; private set; }
    public string Name { get; private set; }

    public Project(string name)
    {
        ValidateName(name);
        Name = name;
    }

    private void ValidateName(string name)
    {
        if (name == null || name.Equals(string.Empty))
        {
            throw new Exception("Project name cannot be empty or null.");
        }
    }
}




public interface IProjectRepository
{
    void InsertProject(Project project);
    IList<Project> GetProjectsByName(string projectName);
}

在我的基础设施层上,我有 IProjectRepository 的实现,它执行实际查询(代码不相关)。


我不喜欢这个设计的两点:

1) 我读到存储库接口(interface)应该是域的一部分,但实现不应该。这对我来说毫无意义,因为我认为域不应该调用存储库方法(持久性无知),这应该是应用程序层中服务的责任。 (有件事告诉我,我大错特错了。)

2) 创建新项目的过程涉及两个验证(不为空和不重复)。在我上面的设计中,这两个验证分散在两个不同的地方,这使得(恕我直言)更难看出发生了什么。

那么,我的问题是,从 DDD 的角度来看,这种建模是否正确,还是您会以不同的方式进行建模?

最佳答案

The process of creating a new project involves two validations (not null and not duplicate). In my design above, those two validations are scattered in two different places making it harder (imho) to see whats going on.

项目不能也不应该知道应用程序中的所有项目(项目本身不应该知道列表中的所有其他项目),因此 - 它是域服务的责任(instead of application service。查看 Evans 书了解确切的区别)。

验证有很多种。和 there can't be universal validation mechanism . DDD 只是说您必须将域验证放在域模型中。

关于c# - 在 DDD 方法中,这个示例是否正确建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2571283/

相关文章:

c# - 在 C# 中解析 Json rest api 响应

c# - Entity Framework 错误...属性无法设置为 'System.Int16' 值

domain-driven-design - 标准值类型作为 DDD 中的 ValueObjects?

asp.net-mvc - 使用扩展方法验证域模型

c# - 'await' 运算符只能在 async > 方法中使用

c# - HttpClient 没有获得完整的网站 html 源代码

c# - 使用 Entity Framework 的 Repository 和 Unit Work 模式正确处理?

git - 如何使用 Git bundle create 仅获取前几次提交

python - 如何在 MS Windows 操作系统上使用 Google 的 repo 工具?

c# - 工作单元和存储库模式对大型项目是否非常有用?