Правильный дизайн хранилища, прикрепление одного объекта к другому - PullRequest
3 голосов
/ 16 декабря 2010

В попытке сохранить хороший дизайн репозитория / IoC я пытаюсь найти наилучший подход к текущей проблеме.

Есть два объекта, Member и Character.

По сути, один член может иметь много символов. Достаточно просто.

Member
{
 IList<Character> Characters { get; set; }
}

Есть IMemberRepository ...

interface IMemberRepository
{
 MemberCreateStatus CreateMember(string email, string password);
 bool ValidateMember(string email, string password);
 bool ChangePassword(string email, string password, string newPassword);
 void RecoverPassword(string email);
}

А есть ICharacterRepository

interface ICharacterRepository
{
 Character CreateCharacter(string name);
}

Итак, мой вопрос довольно прост. Где я хочу добавить логику для добавления Character к Member? Я делаю это в IMemberRepository? Это кажется громоздким для меня. Это выходит за рамки задач IMemberRepository. Я добавлю это к ICharacterRepository? Это тоже кажется мне немного странным, потому что предоставление этих знаний о членстве, кажется, нарушает их разделение. Какой лучший подход, чтобы принять здесь?

Если бы это был только один этот метод, это не было бы слишком большим делом - но между двумя классами должно произойти много других вещей. Каков «стандартный» подход к ситуации, когда два объекта связаны друг с другом? Я кодирую это в ASP.NET MVC .

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

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

Репозитории должны обеспечивать семантику сбора для набора данных. Это означает, что репозитории получают, добавляют и удаляют вещи. Они не подтверждают. Они ничего не меняют в отдельных предметах. Они не являются объектами доступа к данным (DAO), хотя в последнее время многие люди называют вещи репозиторием, а затем делают их похожими на DAO.

Ваш участник содержит список персонажей. Большой! Хотите добавить персонажа к участнику? Сделайте точно это. Member.AddCharacter(...) или Member.Characters.Add(...). Я обычно использую первый, но последний может также работать (но требует пользовательских реализаций коллекции).

1 голос
/ 16 декабря 2010

Я чувствую, что IMemberRepository обязан заполнить Characters Member. Есть несколько причин:

  • Поскольку IMemberRepository является Member типом Repository, он знает, из чего состоит Member. И именно поэтому он знает о Character типе.
  • Это, конечно, не ICharacterRepository ответственность. Тип Character может использоваться для создания других типов в будущем. Это повлияет на Character Repository всякий раз, когда вы добавляете новый тип.
  • IMemberRepository будет использовать ICharacterRepository для заполнения Character объектов в Member.
0 голосов
/ 16 декабря 2010

Самый естественный для меня подход - поместить эту логику в класс Member, поскольку объект Member отвечает за отслеживание своих собственных символов.

Что вы думаете об этом?

...