Шаблон репозитория и удаление элементов при использовании SQL-интерфейса - PullRequest
1 голос
/ 17 февраля 2009

Допустим, у меня есть класс с именем Post, содержащий IList

Я нахожу, что довольно легко справиться с добавлением Комментариев в список, когда я прошу мой репозиторий обновить мой пост, он может видеть, какие комментарии являются новыми, и отправлять на мой слой данных необходимую информацию, но что делать, когда комментарий удален? Как вы справляетесь с этим?

Не могли бы вы вернуть список комментариев, чтобы проверить, какие из них больше не существуют в текущей измененной коллекции?

Или подключать события, чтобы отслеживать это?

или что-то еще целиком?

Просто для дополнительной информации, я делаю это в C # и не могу использовать O / R Mapper. Я должен использовать хранимые процедуры для извлечения наборов данных и сопоставления моих объектов вручную. У меня может быть неправильное понимание шаблона репозитория, но я использую его для передачи данных на уровень данных, от запроса данных, добавления данных и тому подобного, и он сопоставляет данные моего набора данных с объектами и возвращает объект (ы). Так что не стесняйтесь подробно рассказать, как использовать шаблон Repository, если хотите.

1 Ответ

0 голосов
/ 20 февраля 2009

Если я понимаю, что вы пытаетесь сделать, вы добавляете комментарий () к соответствующему 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);
  }
}

Пожалуйста, прокомментируйте, если у других есть мнения или изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...