Поскольку прошло 2 года с тех пор, как я задал вопрос и вопрос несколько неправильно понял, я попытаюсь ответить на него сам.
Перефразированный вопрос: "Должны ли классы бизнес-сущностей быть полностью невежественными?"
Я думаю, что классы сущностей должны быть полностью невежественными, потому что вы будете создавать их во многих местах в своей кодовой базе, так что быстро станет грязно, когда всегда придется вставлять класс Repository в конструктор сущностей, и при этом он не выглядит очень чистым.Это становится еще более очевидным, если вам нужно ввести несколько репозиториев.Поэтому я всегда использую отдельный обработчик / класс обслуживания для выполнения заданий персистентности для сущностей.Эти классы создаются гораздо реже, и вы обычно лучше контролируете, где и когда это происходит.Классы сущностей сохраняются как можно более легкими.
Теперь у меня всегда есть 1 корень агрегирования для репозитория, и если мне нужна дополнительная бизнес-логика, когда сущности выбираются из репозиториев, я обычно создаю 1 ServiceClass для корня агрегата.
Взяв подправленный пример кода в вопросе, поскольку это был плохой пример, я бы сделал это сейчас так:
Вместо:
public class Contact
{
private readonly IContactRepository _contactRepository;
public Contact(IContactRepository contactRepository)
{
_contactRepository = contactRepository;
}
public void Save()
{
_contactRepository.Save(this);
}
}
Iсделать это так:
public class Contact
{
}
public class ContactService
{
private readonly IContactRepository _contactRepository;
public ContactService(IContactRepository contactRepository)
{
_contactRepository = contactRepository;
}
public void Save(Contact contact)
{
_contactRepository.Save(contact);
}
}