0

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

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

这可能/可能看起来不像业务需求..但是如果一些业务专家解释了一些看起来像的东西,那么我们如何从上述陈述中塑造领域模型..任何人都可以识别实体、价值对象、领域事件, 聚合根

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

4

1 回答 1

1

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

  1. 用户必须有电子邮件才能注册。
  2. 管理员必须在注册后将角色应用到用户。
  3. 必须通过欢迎消息通知用户凭据详细信息。

根据您的问题,我无法判断 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; }
}
于 2014-10-10T16:24:33.257 回答