Я создаю некоторые репозитории для приложения MVC, и я пытаюсь найти правильный способ разделить обязанности между репозиториями. В большинстве случаев это очевидно. Но есть один частный случай, когда я не уверен, какой правильный ответ.
Пользователям этого приложения необходимо отслеживать несколько типов времени для своих сотрудников. Для простоты рассмотрим только два. Я назову их "тайм-карты" и "посещаемость". Точный характер разницы между этими двумя не очень важен, но вы должны отметить, что конечные пользователи считают их полностью отдельными данными. Я думаю, однако, что причина, по которой они считают их полностью отдельными данными, заключается в том, что у них никогда не было возможности увидеть их вместе в прошлом. Оба типа записей имеют почти совершенно разные бизнес-правила, касающиеся редактирования записей, но они также, как правило, являются как отчетами о том, где сотрудник находился в определенное время. Оба типа записей времени имеют много общих свойств, таких как общее количество часов, и сотрудника, для которого было собрано время. Оба типа также имеют несколько свойств, которые полностью уникальны для отдельного типа. Мы сохраняем эти "дополнительные" свойства в экземпляре другого типа. Итак, общая структура выглядит так:
class TimeRecord
{
Person Employee { get; set; }
TimeSpan? Hours { get; set; }
}
class TimeCardData
{
TimeRecord Record { get; set; }
TProperty TimeCardProperty { get; set; }
}
class AttendanceData
{
TimeRecord Record { get; set; }
TProperty AttendanceProperty { get; set; }
}
Итак, вопрос: Сколько репозиториев требуется здесь?
1 репозиторий
Конструкция с одним репозиторием будет выставлять методы для возврата "временных карт", "записей посещаемости" или обоих типов в один список. Это довольно удобно для клиентов репозитория, но, на мой взгляд, существует реальная опасность стать очень толстым классом. Я думаю, что репозиторий только для "временных карт" уже станет одним из крупнейших хранилищ в системе, даже без обработки "посещаемости" просто из-за сложных бизнес-правил.
2 репозитория
В другой конструкции будет один репозиторий для "временных карт" и другого репозитория для записей "посещаемости". Это имеет то преимущество, что бизнес-правила, например, "карты времени", находятся в определенном месте. Но я также хотел бы иметь возможность получить список всех записей времени, независимо от типа. Непонятно, какой репозиторий использовать для этого случая. Оба?
3 репозитория
Также существует возможность создания одного хранилища для "временных карт", другого репозитория для записей "посещаемости" и третьего репозитория для предоставления списка только для чтения всех записей времени. Как и дизайн 2-го репозитория, это имеет то преимущество, что бизнес-правила, например, "карты времени", сами по себе. Теперь ясно, где можно получить объединенный список. Но мне кажется странным, что я могу получить одну и ту же запись из двух разных репозиториев.
Hybrid
Гибридный подход будет использовать один репозиторий, но переместить любой код бизнес-правил (включая выбор записей) в отдельные типы. В этом примере единый "хранилище реестров времени" будет собирать экземпляры классов реализации бизнес-правил для "временной карты" и "посещаемости". Я думаю, что это тот подход, который я предпочитаю прямо сейчас.
Другое
Все, что я пропустил? Любые убедительные аргументы для одного проекта над другим?