【发布时间】:2018-06-13 07:51:29
【问题描述】:
我在这里阅读了这个问题:Having Separate Domain Model and Persistence Model in DDD
并专门看这段代码:
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();
}
}
此代码表示存在单独的域模型和持久性模型。我试图了解使用这种方法的局限性是什么。在整个互联网上,我读到了使用 NHibernate 时更改跟踪是一个问题,但我不明白为什么。更改跟踪是在域模型映射回持久性模型之后处理的。变更跟踪如何成为问题?更改跟踪如何成为问题的一个实际示例将对我有所帮助。
更新 请看下面的代码:
//Repository
public Ticket GetTicket(int ticketId)
{
return this.ticketsRepository.GetById(ticketId);
}
我在应用程序服务中这样做:
//Application Service
Ticket ticket = applicationService.GetTicket(1);
ticket.Cost = .....
TicketEntity ticketEntity = AutoMapper.Map<TicketEntity>(ticket);
ticketEntity.DomainMethod();
ticket = AutoMapper.Map<Ticket>(ticketEntity);
Q1) ORM 的好处是否在此代码中丢失了,例如变更跟踪?请注意,持久性对象是从存储库返回的,然后映射到域对象,然后又回到同一个持久性对象。
Q2) NHibernate 如何跟踪更改,即它如何知道 Ticket(persistence object) 是数据库中的票据 1。我想这不仅仅是ID。
【问题讨论】:
-
也许晚了,但是如果有人有兴趣看到一个使用 DDD 与单独的域和持久性模型的示例,同时仍然保持 EntityFramework 的更改跟踪功能的好处,您可以参考我写的这篇文章:Change Tracking while doing DDD源代码位于:GitHub 是的,我知道它不是 NHibernate,但它可能对 EntityFramework 的用户有所帮助。
标签: c# nhibernate domain-driven-design