如何解决使用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
解决方法
对您来说困难的原因是因为您稍微偏离了DDD原则。您需要将其他概念重构为在普遍存在的语言中有意义的内容。 根据您的描述,这是我的期望:
时间范围和日历
- 您可以拥有一个名为Appointment的实体,并且Appointment的值类型为“时间范围”。您不能在约会之外设置时间范围,这毫无意义。约会具有约会日期和时间的唯一键。
- 日历是用户类型实体的值类型。因此,“用户有日历”,相反,“没有用户日历就无法存在”。
星级评分类型 首先,我强烈建议您从该类中获取“构建HTML”类型的内容,并放入域外部的单独的UI类型类中。 然后,我希望看到一个已评级的实体。也就是说,星级评定将是被评定实体内部的值类型。它不能单独存在于实体外部。它不会“适合”。
,Eric Evans的域驱动设计建议“至少”使用以下4层:
接口
您的UI技术或HTTP服务(如REST和SOAP)。
应用
在这里创建使用域逻辑的应用程序流。我看到的大多数人都将他们的 ViewModels 放在哪里,以满足特定流程的需求。
域
应该在其中放置属于域的模型和类型,请确保RentalProperty和StarRating在这里更合适。同样在这里,您可以创建域服务,接口,以反转基础结构层和任何特定于域的代码的依赖性。
基础结构
类似于存储库的类,它们依赖于基础结构(数据库,网络,其他服务,IO)。
但是请记住,DDD是查看应用程序和大量建议的一种方式,许多人在自己的DDD实现中使用不同的细节和信念。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。