c# - 使用 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 将具有“时间范围”的值类型。您不能在约会之外有时间范围,这是没有意义的。约会具有约会日期和时间的唯一键。
- Calendar 是 User-Type 实体的值类型。因此,“一个用户有一个日历”,相反,“没有用户,日历就不能存在”。
星级类型 首先,我强烈建议您从该类中获取“构建 HTML”类型的内容,并将其放入域外的单独 UI 类型类中。然后,我希望看到一个被评级的实体。也就是说,Star Rating 将是被评级实体内部的一个值类型。它不能独立存在于实体之外。它不会“适合”。
推荐阅读
- java - 有限通量的无限通量。或者:如何在不完成通量的情况下重新连接到 websocket steam
- python - PySimpleGUI 列表索引超出列表框小部件的范围?
- ruby-on-rails - 如何根据传递给它的对象类对调用不同方法的助手进行存根和测试?
- python - 导入 matplotlib.pyplot 作为 plt 失败
- azure - 使用门户同时将文件上传到 Azure 文件共享,并使用 ShareClient 库作为 WebJob 下载文件
- python-3.x - 将标头注入来自烧瓶应用程序的输出请求
- java - Android:验证半角日文字符
- javascript - 指纹js没有加载到chrome扩展中
- java - Jmeter4中的handshake_failure
- javascript - 反应水平滚动菜单从左箭头到 item1 占用额外空间