最佳答案
我一直在阅读关于领域驱动的设计以及如何实现它,同时使用代码优先的方法来生成一个数据库。根据我的阅读和研究,围绕这个主题有两种观点:
有1个既作为域模型又作为持久性模型的类
有两个不同的类,一个实现域逻辑,另一个用于代码优先方法
现在我知道意见1)被认为是简化了领域和持久模型之间没有太多区别的小型解决方案,但是我认为它打破了单一责任原则,并且当 ORM 的约定干扰 DDD 时引入了很多问题。
令我惊讶的是,有大量的代码示例说明如何实现意见1)。但是还没有找到一个单独的例子来说明如何实现意见2以及如何映射这两个对象。(可能有这样的例子,但我没有找到一个 C # 1)
因此,我试图自己实现一个示例,但我不确定这是否是一个好方法。
假设我有一个票务系统,票务有到期日期:
/// <summary>
/// Domain Model
/// </summary>
public class TicketEntity
{
public int Id { get; private set; }
public decimal Cost { get; private set; }
public DateTime ExpiryDate { get; private set; }
public TicketEntity(int id, decimal cost, DateTime expiryDate)
{
this.Id = id;
this.Cost = cost;
this.ExpiryDate = expiryDate;
}
public bool IsTicketExpired()
{
if (DateTime.Now > this.ExpiryDate)
{
return true;
}
else
{
return false;
}
}
}
使用实体框架作为 ORM 的持久性模型看起来几乎相同,但是随着解决方案的增长,情况可能就不是这样了
/// <summary>
/// ORM code first Persistence Model
/// </summary>
public class Ticket
{
[Key]
public int Id { get; set; }
public decimal Cost { get; set; }
public DateTime ExpiryDate { get; set; }
}
目前看来一切顺利。现在我不确定的是,从存储库中获取 Ticket
持久性模型的最佳位置是哪里,以及如何将其映射到 TicketEntity
域模型
我已经在应用程序/服务层中完成了这项工作。
public class ApplicationService
{
private ITicketsRepository ticketsRepository;
public ApplicationService(ITicketsRepository ticketsRepository)
{
this.ticketsRepository = ticketsRepository;
}
public bool IsTicketExpired(int ticketId)
{
Ticket persistanceModel = this.ticketsRepository.GetById(ticketId);
TicketEntity domainModel = new TicketEntity(
persistanceModel.Id,
persistanceModel.Cost,
persistanceModel.ExpiryDate);
return domainModel.IsTicketExpired();
}
}
我的问题是:
除了加快开发和重用代码之外,是否还有其他原因使得意见1)比意见2更受欢迎。
我的模型映射方法有什么问题吗?有没有什么我没注意到的东西会在解决方案生长时引起问题?