定义域模型是最重要的任务..不幸的是,它是DDD中最难的一步。我想知道如何从以下语句中设计一个简单的域模型。
" 每个用户都必须有一封电子邮件来操作系统。用户必须使用电子邮件和密码进行注册。管理员/用户可以启动注册过程。用户成功注册管理员必须为用户分配预定义角色,单个用户可以分配给多个角色。注册过程完成后,必须向用户发送有关凭证详细信息和欢迎消息的电子邮件。每个用户都有一个或多个键/值配对标识符,称为Claims.So管理员可以将声明分配给单个或组用户。"
这可能看起来像是一个商业要求......但如果某个商业专家解释了一些事情,那么我们如何从上述陈述中塑造一个领域模型......任何人都可以识别出E ntities,value objects,domain events,aggregate roots
注意:考虑到堆栈溢出的规则和规定,这个问题可能是一个偏离主题。而不是阻止/删除这篇文章,请建议我在哪里发布它以获得一些反馈。
答案 0 :(得分:1)
DDD的主要目的是以明确的方式对业务规则进行建模。在你的情况下,我看到这些规则:
我无法根据你的问题告诉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; }
}