Я читал о дизайне, управляемом доменом, и о том, как его реализовать, при использовании первого подхода кода для создания базы данных. Из того, что я прочитал и исследовал, есть два мнения по этому вопросу:
-
Имейте 1 класс, который служит как модель домена, так и модель сохранения.
-
У вас есть 2 разных класса, один из которых реализует логику домена, а другой - для подхода, основанного на кодах
Теперь я знаю мнение 1), как говорят, упрощает небольшие решения, которые не имеют много различий между моделями домена и персистентности, но я думаю, что это нарушает принцип единой ответственности и тем самым вводит множество проблем, когда соглашения ORM мешают DDD.
Что для меня неожиданно, есть многочисленные примеры кода, как реализовать мнение 1). Но a не нашел ни одного примера того, как реализовать мнение 2) и как сопоставить 2 объекта. (Наверное, есть такие примеры, но я не смог найти С# один)
Итак, я попытался реализовать пример самостоятельно, но я не уверен, что это хороший способ сделать это.
Скажем, у меня есть система билетов и билеты имеют срок действия. Моя модель домена будет выглядеть так:
/// <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), кроме ускорения разработки и повторного использования кода.
-
Есть ли какие-либо проблемы в моем подходе к отображению моделей? Есть ли что-то, что я пропустил, что вызовет проблемы, когда решение будет расти?