使用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字符串存储在DB中,而不是创建一对多关系。我问了一个相关的问题:一对多关系与json字符串

这对你来说很困难的原因是你有点偏离了DDD原则。你需要将你的附加概念重构成在普遍存在的语言中有意义的东西。根据你的描述,以下是我所期望的:

时间范围和日历

  1. 您可以有一个名为Appointment的实体,Appointment将具有一个值类型";时间范围";。你不能在约会之外设定时间范围,这毫无意义。约会具有约会日期和时间的唯一密钥
  2. 日历是用户类型实体的值类型。因此,";用户有一个日历";反之;没有用户日历就不可能存在">

星级评定类型首先,我强烈建议您获得"构建HTML";将该类中的内容键入到域外的一个单独的UI类型类中。然后,我希望看到一个被评级的实体。也就是说,星级评定将是被评定实体内部的一种价值类型。它不能单独存在于实体之外。它不会"适合";。

Eric Evans的领域驱动设计建议使用";至少";以下4层:

接口

您的UI技术或HTTP服务,如REST和SOAP。

应用程序

在这里,您可以创建使用域逻辑的应用程序流。我看到的大多数人都把他们的ViewModels放在那里,以满足特定流的需求。

您应该将模型和属于该域的类型放在哪里,RentalProperty和StarRating当然更适合这里。此外,您还可以在此处创建域服务接口,以反转与基础结构层和任何域特定代码的依赖关系。

基础设施

类,如依赖于基础设施(数据库、网络、其他服务、IO(的存储库。

但请记住,DDD是查看应用程序和许多推荐的一种方式,许多人在自己的DDD实现中使用了不同的细节和信念。

相关内容

最新更新