Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何使用DDD方法从以下语句定义业务模型_Design Patterns_Domain Driven Design_Ddd Repositories_Ddd Service - Fatal编程技术网

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

Design patterns 如何使用DDD方法从以下语句定义业务模型,design-patterns,domain-driven-design,ddd-repositories,ddd-service,Design Patterns,Domain Driven Design,Ddd Repositories,Ddd Service,定义域模型是最重要的任务。不幸的是,这是DDD中最困难的一步。我想知道,如何从下面的语句中设计一个简单的域模型 “每个用户都必须有一封电子邮件才能操作系统。必须使用电子邮件和密码注册用户。管理员/用户可以启动注册过程。一旦用户成功注册,管理员必须为用户分配预定义的角色,单个用户可以分配给多个角色。注册过程完成后,必须向用户发送一封有关凭据详细信息的电子邮件以及欢迎消息。每个用户都有一个或多个密钥/值配对标识符,称为声明。因此管理员可以将声明分配给单个或组用户。“ 这可能是/可能不是一项业务需求。

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

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

这可能是/可能不是一项业务需求。但如果某位业务专家解释了类似的内容,那么我们如何从上述语句中形成域模型。有人能识别实体、值对象、域事件、聚合根吗


注意:考虑到堆栈溢出的规则和规定,这个问题可能是一个离题问题。与其阻止/删除此帖子,不如建议我在哪里发布帖子以获得反馈。

DDD的主要目的是以明确的方式对业务规则建模。在您的案例中,我看到了以下规则:

  • 用户必须有电子邮件才能注册
  • 管理员必须在注册后将角色应用于用户
  • 必须通过欢迎消息通知用户凭据详细信息
  • 基于你的问题,我不知道索赔对象在哪里

    在这里,听起来用户是聚合根,因为我们将对这三个需求进行操作,因此您将有一个类似以下内容的类:

    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; }
    }
    
    public class User//Aggregate Root(随意标记)
    {
    公共字符串Email{get;set;}//value对象
    //TODO:确保上述第#1条中的所需规则
    公共无效注册表(字符串电子邮件){email=email;}
    //上文第2条规则
    public EventHandler Registered;//域事件-订阅者可能会以某种方式通知管理员新注册的用户。
    public void AddRole(Role-Role){//添加角色的代码;}
    //上文第3条规则
    私有IEnumerable角色{get;}
    //管理员或管理员使用的流程将在角色(以及可能的索赔分配)完成后调用此函数通知用户。
    public void NotifyAboutRegistration(INotificationProvider提供程序)
    {
    string message=“;//TODO:从角色类型的description属性生成包含凭据详细信息的欢迎消息字符串。
    provider.SendWelcomeMessage(消息);
    }
    }
    公共结构角色//值对象
    {
    公共字符串名称{get;}
    公共字符串描述{get;}
    }
    
    这看起来像一个普通用户角色模型。我个人认为,挑战在于如何将这个有限的上下文与您的核心域集成。@Hippoom,这正是我所困惑的。这不是业务的一部分。这是应用程序所需的基础架构。我如何在DDD中对基础架构需求建模“基础架构”“您的核心域可能是另一个有界上下文,也可能有自己的域模型(从核心域的角度来看,被视为支持域或通用域)。您可以采用反腐败层或其他集成模式来集成这些有界上下文。@Hippoom,这里我可以介绍一个名为“身份和访问管理”的子系统,但我的问题是提取实体、值对象、域事件、,聚合语句的根。如果此上下文关心对象的生命周期,则将对象标识为实体,例如,本例中的用户。角色的信息不多,可以从实体开始。在最终获得满意的方法之前,您可能会做一些实验,但当您将这些模型分离到单个有界上下文中时,不会对系统的其他部分产生太多副作用。