如何使用TDD方法从以下语句定义业务模型

时间:2014-10-07 17:45:19

标签: design-patterns domain-driven-design ddd-repositories ddd-service

定义域模型是最重要的任务..不幸的是,它是DDD中最难的一步。我想知道如何从以下语句中设计一个简单的域模型。

" 每个用户都必须有一封电子邮件来操作系统。用户必须使用电子邮件和密码进行注册。管理员/用户可以启动注册过程。用户成功注册管理员必须为用户分配预定义角色,单个用户可以分配给多个角色。注册过程完成后,必须向用户发送有关凭证详细信息和欢迎消息的电子邮件。每个用户都有一个或多个键/值配对标识符,称为Claims.So管理员可以将声明分配给单个或组用户。"

这可能看起来像是一个商业要求......但如果某个商业专家解释了一些事情,那么我们如何从上述陈述中塑造一个领域模型......任何人都可以识别出E ntities,value objects,domain events,aggregate roots

注意:考虑到堆栈溢出的规则和规定,这个问题可能是一个偏离主题。而不是阻止/删除这篇文章,请建议我在哪里发布它以获得一些反馈。

1 个答案:

答案 0 :(得分:1)

DDD的主要目的是以明确的方式对业务规则进行建模。在你的情况下,我看到这些规则:

  1. 用户必须有电子邮件才能注册。
  2. 管理员必须在注册后将角色应用于用户。
  3. 必须通过欢迎信息通知用户凭据详细信息。
  4. 我无法根据你的问题告诉Claim对象在哪里。

    在这里,听起来像User是聚合根,因为它是我们将对所有这三个要求进行操作的内容,因此你会看到类似这样的类:

    public class User  //Aggregate Root (mark this however you like)
    {
        public string Email { get; set; }  //value object
    
        //TODO: Ensure required rule from #1 above
        public void Register(string email) { Email = email; }  
    
        //Rule #2 above
        public event EventHandler<EventArgs> Registered;  //Domain event - subscriber will probably notify admin of new registered user somehow.
        public void AddRole(Role role) { //Code to add role; }
    
        //Rule #3 above
        private IEnumerable<Role> Roles { get; }
        //Admin or the process admin uses will call this to notify the user after the role (and maybe claim assignments) are complete.
        public void NotifyAboutRegistration(INotificationProvider provider) 
        {
            string message = "";  //TODO: build string of welcome message with credential details from the description property of the Role type.
            provider.SendWelcomeMessage(message);
        }
    }
    
    public struct Role //Value object
    {
        public string Name { get; }
        public string Description { get; }
    }