шаблон репозитория, формы, геттеры и сеттеры - PullRequest
1 голос
/ 20 октября 2011

ORM часто отображают отношения один-ко-многим, например:

class Parent {
   IList<Child> Children { get; set; }
}

Проблема в том, что в репозитории вы можете иметь:

GetChildrenOfParent(int parentID) {
   from c in Children...

   return children;
}

Теперь у вас есть два места, где можно «заполучить» детей. Если вы хотите что-то добавить, например, вернуть только детей, у которых нет удаленного флага, у вас может быть:

GetChildrenOfParent(int parentID) {
    from c in Children..
    where not deleted

    return children;
}

или

class Parent {
   IList<Child> Children { get .... only get not deleted children; set; }
}

Вы видите, к чему я клоню? Теперь у вас есть два места, в которых можно выбрать выполнение процедуры получения. Кажется, что логическое место для этой подпрограммы - в хранилище, но это означает, что:

foreach (var child in parent.Children)

больше не проходит через ваш "добытчик", следовательно, вся идея ORM о том, что один-ко-многим отображен таким образом, кажется неверной?

1 Ответ

0 голосов
/ 20 октября 2011

Я не совсем уверен, каков твой вопрос, но я не понимаю, где он «неправильный».Все сводится к выбору дизайна IMO.Хотите ли вы получить доступ к иерархическим данным (дочерним объектам) от каждого объекта?Если вы это делаете и хотите загрузить эти данные при первоначальной выборке, то использование одного для многих экономит время (вы можете выбрать предварительную загрузку или отложенную загрузку).В этом случае получение ваших данных в первом примере может быть полезным для вас.Вы можете использовать LINQ для фильтрации данных, чтобы вернуть только «не удаленные» результаты или «любой фильтр, который вам нужен», например так:

IList<Child> list = parent.Children.Where(x => x.Deleted == false);

Лично мне нравится держать его в чистоте, и когда яиспользуя шаблон репозитория (в последнее время я становлюсь большим поклонником шаблона ActiveRecord).Я предпочитаю разделить это на собственный вызов метода.Вы можете добавить вызов репозитория в имя свойства children, но тогда для меня такое ощущение, что я пересекаю границы между моделью и местом, где я пишу эту модель.

Но иногда я делаю это таким образомВ итоге вы получаете целую кучу методов для базовой фильтрации или глупую кучу или перегрузки для управления случаями, когда вы хотите выбрать, скажем, «Удален или нет» и «Мужской или Женский» или просто «Удален или нет».

Как я уже сказал, все сводится к выбору.Как вы хотите, чтобы ваше приложение росло, если вы думаете, что в конечном итоге вы получили список глупых перегрузок в хранилище, можете ли вы сделать его чище, чтобы будущие кодеры могли понимать ваш код, меньше кода для управления, и это не так?мешать производительности (или заставляет работать лучше в идеале).В этом случае наличие тестов поможет вам выполнить рефакторинг без нарушения кода.

Не зацикливайтесь на «правильном» или «неправильном» способе ведения дел.

...