Как получить доступ к свойствам класса EF с уровня обслуживания
-
28-10-2019 - |
Вопрос
У меня есть ASP.NET MVC3 в C# и Razor. Архитектура приложения разделена на уровень доступа к данным (классы EF + репозиторий), уровень обслуживания, контроллер, просмотр и просмотр.
От моего сервисного слоя ProductServices
Я называю метод GetAllProducts
выставлен моим хранилищем ProductRepository
, который имеет следующую подпись:
IQueryable<Products> GetAllProducts()
Поэтому внутри ProductServices
Я звоню (productRepository
это случай ProductRepository
):
var products = productRepository.GetAllProducts();
что заполняет переменную products
. Анкет Теперь я хотел бы получить доступ к названию продукта ProductName
из productServices
. Анкет Если я использую эту инструкцию:
var productNames = products.Select(m => m.ProductName).ToList();
Я создаю связь между ServiceLayer и Эф (Обход репозитория). Это означает, что я должен добавить к ProductRepository
Метод с подписью:
IQueryable<string> GetAllProductsName()
Однако, поскольку мне нужна другая информация о продукте в моем приложении, я буду создавать один метод в productRepository
Для каждого поля Product
учебный класс? Мои рассуждения верны? Спасибо
Решение
Есть две школы мысли об этом,
- Репозиторий явно определяет, как вы взаимодействуете с базой данных, и его следует тесно управлять. Поэтому методы репозитория должны предоставлять перечисленные данные
- Репозиторий нарушает сильную связь с конкретным типом данных, но не нужно предоставлять подробные и перечисленные наборы данных.
Лично я подписываюсь на второе, вот почему:
Я чувствую, что когда вы становитесь чрезмерно ясным в репозитории, он превращается в бизнес -логику, а не в механизм развязки. Мне это не очень нравится, так как это означает, что вы становитесь более тесно связанными с реализацией репозитория.
Я также думаю, что в некоторых случаях репозиторий не является подходящим местом для перечисления данных, например, я считаю, что пейджинг и сортировка являются проблемой пользовательского интерфейса, однако для выполнения, которые вы хотите, чтобы запросы были связаны только с текущей страницей/сортировкой. Это означает, что вам либо нужно позволить пользовательскому интерфейсу внести свой вклад в сборник запроса, либо репозиторий должен понять пейджинг и сортировку.
Сказав, что предоставление не выключенных данных открывает вас для выпусков, позже по дороге, и даже если вы предоставите им очень важно перечислять набор как можно скорее.
Если вам интересно, это мое мнение о репозиториях: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html , весь код также на GitHub
Другие советы
У вас есть вся информация в ваших продуктах, потому что вы загружаете всю информацию из вашего репозитория с помощью метода ProductRepository.getallProducts (). Если вам нужна дополнительная информация от другой организации, вам нужно расширить свои продукты с новым сервисом.
Однако, поскольку в моем приложении мне нужна другая информация о продукте, создать один метод в продюсерепозитории для каждого поля класса продукта? Мои рассуждения верны? Спасибо
В этой ситуации я обычно создаю метод расширений для службы, а не в репозитории. Репозиторий обычно имеет настройку CRUD и ничего более.