Если я понимаю, что вы пытаетесь сделать, вы добавляете комментарий () к соответствующему IList, который прикреплен к сообщению (). А внутри вашего Post () вы ищете новые комментарии () в IList и сохраняете их. Наличие объекта Post () для управления его дочерними объектами, такими как Comment (), действительно идет по пути DDD.
Я все еще новичок в этих моделях; но лично я склоняюсь к концепции, что любой объект, у которого есть метаданные, я рассматриваю как свою собственную модель объекта; поэтому я создаю свой собственный репозиторий для каждой модели сущностей.
Post()
PostRepository : IPostRepository
Comment()
CommentRepository : ICommentRepository
Теперь, имея IList Post.Comments, я считаю, нарушает Закон Деметры , позволяя вам выполнить Post.Comments.Add ().
Я полагаю, что решение вашей проблемы было бы не добавить в IList, а создать методы для Post () для обработки комментариев, связанных с этим экземпляром Post:
Post.AddComment()
Post.FetchComments()
Post.DeleteComments(IList<Comment> comments)
Тогда внутри вашего объекта Post () вы подключите свой ICommentRepository (скорее всего, с ServiceLocator, или я предпочитаю Castle Windsor) и обработаете добавление и удаление их.
ICommentRepository.AddByPostID()
ICommentRepository.FetchByPostID()
ICommentRepository.Remove(int commentID)
Опять же, я все еще новичок в паттернах DDD; но я полагаю, что это делает Разделение проблем действительным и маскирует основную логику, оставляя ее в заботе Post () «обрабатывать только действия, связанные с комментариями, относящимися к этому объекту Post».
Полный класс Post () будет выглядеть примерно так:
private ICommentRepository _commentRepo;
public class Post
{
public Post(ICommentRepository commentRepo)
{
// Or you can remove this forced-injection and use a
// "Service Locator" to wire it up internall.
_commentRepo = commentRepo;
}
public int PostID { get; set; }
public void DeleteComments(IList<Comment> comments)
{
// put your logic here to "lookup what has been deleted"
// and then call ICommentRepository.Delete() in the loop.
_commentRepo.Remove(commentID);
}
}
Пожалуйста, прокомментируйте, если у других есть мнения или изменения.