首页 > 解决方案 > 使用 DDD,将一些在应用程序中随处使用的基本类型放在哪里是最好的速度

问题描述

我想在我的应用程序中引入日历预订系统,我定义了以下类型:

public class TimeRange
{
    public TimeRange()
    {
        Start = End = default;
    }

    public DateTime Start { get; set; }

    public DateTime End { get; set; }
}

public class Calendar
{
    public Calendar()
    {
        Appointments = new List<TimeRange>();
    }

    public List<TimeRange> Appointments { get; set; }
}

我也在使用审查系统,为此我介绍了一种StarRating类型

// example: 3.5 out of 5 stars
public class StarRating
{
    public StarRating(double rating, int outOf)
    {
        Rating = rating;
        OutOf = outOf;
    }

    public double Rating { get; set; }

    public int OutOf { get; set; }

    // builds HTML code for displaying 3.5 starts out of 5
    public string GetStarRatingHtml(string colorClass = "")
    {
        var starRatingHtml = new StringBuilder();

        for (int i = 0; i < OutOf; i++)
        {
            if (Rating >= (float)(i + 0.75))
            {
                starRatingHtml.Append(GetFullStar(colorClass));
            }
            else if (Rating > (float)(i + 0.25))
            {
                starRatingHtml.Append(GetHalfStar(colorClass));
            }
            else
            {
                starRatingHtml.Append(GetEmptyStar(colorClass));
            }
        }

        TagBuilder span = new TagBuilder("span");
        span.Attributes.Add("Title", Rating + " Stars");
        span.InnerHtml = starRatingHtml.ToString();
        return span.ToString();
    }

    private string GetFullStar(string colorClass = "")
    {
        return $"<span class='fa fa-star full-star {colorClass}'></span>";
    }

    private string GetHalfStar(string colorClass = "")
    {
        return $"<span class='fa fa-star-half-o half-star {colorClass}'></span>";
    }

    private string GetEmptyStar(string colorClass = "")
    {
        return $"<span class='fa fa-star-o empty-star {colorClass}'></span>";
    }
}

我想遵循 DDD 指南,但不清楚放置这些类型的最佳位置在哪里?

1.我应该把它们放在我的领域层吗?

由于所有其他层都可以访问域层,因此我可以在我的应用程序中的任何地方使用这些类型。但我实际上并没有在我的域模型中使用任何这些类型,例如,我有一个RentalProperty域模型:

public class RentalProperty
{
    public long PropertyId { get; set; }

    public string Address { get; set; } 

    public string ViewingTimes { get; set; } // <-- Contains Calendar class serialized to json string
}

2.如果我把这些类型放在领域层,我应该ViewModels在我的应用层中创建对应的吗?

以上面的例子为例,我RentalPropertyViewModel在我的应用层

public class RentalPropertyViewModel
{
    public long PropertyId { get; set; }

    public string Address { get; set; } 

    public Calendar ViewingTimes { get; set; } // <-- Should I create CalendarViewModel in application layer?
}

3. 是否应该将它们视为内置类型并将它们放在横切层中?


更新:我认为我困惑的主要原因是我决定将序列化的日历时间作为 json 字符串存储在数据库中,而不是创建一对多的关系。我已经问过这个相关的问题:1-to-many relationship vs json string

标签: c#domain-driven-design

解决方案


对你来说很难的原因是因为你有点偏离 DDD 原则。您需要将您的附加概念重构为在通用语言中有意义的东西。根据您的描述,这是我所期望的:

时间范围和日历

  1. 您可以有一个名为 Appointment 的实体,并且 Appointment 将具有“时间范围”的值类型。您不能在约会之外有时间范围,这是没有意义的。约会具有约会日期和时间的唯一键。
  2. Calendar 是 User-Type 实体的值类型。因此,“一个用户有一个日历”,相反,“没有用户,日历就不能存在”。

星级类型 首先,我强烈建议您从该类中获取“构建 HTML”类型的内容,并将其放入域外的单独 UI 类型类中。然后,我希望看到一个被评级的实体。也就是说,Star Rating 将是被评级实体内部的一个值类型。它不能独立存在于实体之外。它不会“适合”。


推荐阅读