我一直在阅读关于领域驱动设计以及如何使用代码优先方法生成数据库的实现方式。根据我的阅读和研究,这个主题有两种观点:
有一个类同时担任领域模型和持久化模型的角色。
有两个不同的类,一个用于实现领域逻辑,另一个用于代码优先方法。
现在我知道观点1)被认为是简化没有领域模型和持久化模型之间太多差异的小型解决方案的做法,但我认为它违反了单一责任原则,并且引入了大量问题,当ORM的约定与DDD相冲突时。
让我惊讶的是,有很多实现观点1)的代码示例。但我没有找到一个实现观点2)的单一示例以及如何映射这两个对象。(可能有这样的示例,但我没有找到C#的示例)
所以我试着自己实现一个示例,但我不确定这是否是一个好方法。
假设我有一个票务系统,票有过期日期。我的领域模型如下:
/// <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;
}
}
}
使用Entity Framework作为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)更好?
在映射模型时,我的方法是否存在任何问题?如果解决方案不断增长,是否会出现问题?