То, что приемлемо, довольно субъективно, но если вы хотите сделать правильный доступ к данным, я предлагаю вам НЕ использовать шаблон репозитория, так как он ломается по мере усложнения вашего приложения.
Основная причина - минимизация доступа к базе данных.Так, например, посмотрите на свой репозиторий и обратите внимание на метод GetUser()
.Теперь отступите от кода и подумайте, как будет использоваться ваше приложение.Теперь подумайте о том, как часто вы будете запрашивать данные из пользовательской таблицы без каких-либо дополнительных данных.Ответ почти всегда будет «редко», если вы не создаете базовое приложение для ввода данных.
Вы говорите, что ваше приложение будет отображать множество сеток.Какие данные в этой сетке?Я предполагаю (не зная вашего домена приложения), что сетки будут объединять пользовательские данные с другой информацией, которая важна для этого пользователя.Если это так, как вы делаете это с вашими репозиториями?
Один из способов - вызывать каждый метод репозитория индивидуально, например так:
var user = userRepository.GetUser("KallDrexx");
var companies = companyRepository.GetCompaniesForUser(user.Id);
Теперь это означает, что у вас есть 2 базы данных.призывает к тому, что действительно должно быть только одно.Поскольку ваши экраны становятся все более и более сложными, это приведет к увеличению и увеличению числа обращений к базе данных, а если ваше приложение получит значительный трафик, это вызовет проблемы с производительностью.Единственный реальный способ сделать это в шаблоне репозитория - это добавить специальные методы в ваши репозитории для выполнения этого конкретного запроса, например:
public class UserRepository
{
public User GetUser(string userName)
{
// GetUser code
}
public User GetUserWithCompanies(string userName)
{
// query code here
}
}
Так что теперь, если вам нужны пользователи и сообщают их контактные данные водин запросТеперь вам нужно добавить еще один метод в свой пользовательский репозиторий.Теперь предположим, что вам нужно выполнить еще один запрос, который также возвращает количество клиентов в каждой компании, поэтому вам нужно добавить еще один метод (или добавить необязательный параметр).Теперь предположим, что вы хотите добавить запрос, который возвращает все компании и пользователей, которых они содержат.Теперь вам нужен новый метод запроса, но возникает вопрос: вы помещаете его в репозиторий User
или Company
?Как вы отслеживаете, в каком из них он находится, и облегчаете выбор между GetUserWithCompany
и GetCompanyWithUsers
, когда вам это понадобится позже?
С этого момента все становится очень сложным, и это те ситуации, которыезаставили меня отказаться от шаблона хранилища.Что я делаю сейчас для доступа к данным, я создаю отдельные классы запросов и команд, каждый класс представляет 1 (и только 1) команду запроса или обновления данных для базы данных.Каждый класс запросов возвращает модель представления, которая содержит только данные, которые мне нужны для одного конкретного сценария использования пользователя.Существуют и другие шаблоны доступа к данным (шаблон спецификации, некоторые хорошие разработчики даже говорят, что вам следует просто осуществлять доступ к данным в ваших контроллерах, поскольку EF - это ваш уровень доступа к данным).
Ключом к успешному доступу к данным является хорошее планирование.Вы знаете, как будут выглядеть ваши экраны?Знаете ли вы, как пользователи будут использовать вашу систему?Знаете ли вы все данные, которые на самом деле будут на каждом экране?Если ответ на любой из этих вопросов - «нет», то вам нужно сделать шаг назад и забыть о слое данных, поскольку уровень данных (или должен быть для хорошего приложения) определяется на основе того, как приложение будет на самом деле.пользовательский интерфейс и экраны не должны зависеть от того, как был разработан уровень данных.Если вы не учитываете потребности пользовательского интерфейса и сценарии использования пользователей при разработке доступа к данным, ваше приложение не будет хорошо масштабироваться и не будет работать.Иногда это не проблема, если вы не планируете, чтобы ваш сайт был большим, но никогда не помешало бы помнить об этом.