Design patterns 如何使用DDD方法从以下语句定义业务模型
定义域模型是最重要的任务。不幸的是,这是DDD中最困难的一步。我想知道,如何从下面的语句中设计一个简单的域模型 “每个用户都必须有一封电子邮件才能操作系统。必须使用电子邮件和密码注册用户。管理员/用户可以启动注册过程。一旦用户成功注册,管理员必须为用户分配预定义的角色,单个用户可以分配给多个角色。注册过程完成后,必须向用户发送一封有关凭据详细信息的电子邮件以及欢迎消息。每个用户都有一个或多个密钥/值配对标识符,称为声明。因此管理员可以将声明分配给单个或组用户。“ 这可能是/可能不是一项业务需求。但如果某位业务专家解释了类似的内容,那么我们如何从上述语句中形成域模型。有人能识别实体、值对象、域事件、聚合根吗Design patterns 如何使用DDD方法从以下语句定义业务模型,design-patterns,domain-driven-design,ddd-repositories,ddd-service,Design Patterns,Domain Driven Design,Ddd Repositories,Ddd Service,定义域模型是最重要的任务。不幸的是,这是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,这里我可以介绍一个名为“身份和访问管理”的子系统,但我的问题是提取实体、值对象、域事件、,聚合语句的根。如果此上下文关心对象的生命周期,则将对象标识为实体,例如,本例中的用户。角色的信息不多,可以从实体开始。在最终获得满意的方法之前,您可能会做一些实验,但当您将这些模型分离到单个有界上下文中时,不会对系统的其他部分产生太多副作用。