Как получить доступ к свойствам класса EF с уровня обслуживания

StackOverflow https://stackoverflow.com/questions/9360588

Вопрос

У меня есть 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 учебный класс? Мои рассуждения верны? Спасибо

Это было полезно?

Решение

Есть две школы мысли об этом,

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

Лично я подписываюсь на второе, вот почему:

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

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

Сказав, что предоставление не выключенных данных открывает вас для выпусков, позже по дороге, и даже если вы предоставите им очень важно перечислять набор как можно скорее.

Если вам интересно, это мое мнение о репозиториях: http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html , весь код также на GitHub

Другие советы

У вас есть вся информация в ваших продуктах, потому что вы загружаете всю информацию из вашего репозитория с помощью метода ProductRepository.getallProducts (). Если вам нужна дополнительная информация от другой организации, вам нужно расширить свои продукты с новым сервисом.

Однако, поскольку в моем приложении мне нужна другая информация о продукте, создать один метод в продюсерепозитории для каждого поля класса продукта? Мои рассуждения верны? Спасибо

В этой ситуации я обычно создаю метод расширений для службы, а не в репозитории. Репозиторий обычно имеет настройку CRUD и ничего более.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top