Уровень и класс DataAccess, куда мне поместить мои функции?

Я использую Dapper для заполнения своего класса с помощью класса доступа к данным. В этом классе я делаю все свои операции CRUD.

public class Product
{
   public int id { get; set; }
   public string description {get;set;}
   public string value {get;set;}
}

public class ProductDa
{
  //CRUD operations using Dapper
  public List<Product> GetAllElements();
}

Теперь мне нужно создать функцию, которая возвращает количество элементов с определенным значением.

Public int ReturnCountValue(int val)

В этой функции я буду называть мой GetAllElements а затем используйте LINQ для возврата желаемого значения.

То, что мне интересно, это то, где я должен положить ReturnCountValue функция: ProductDa (уровень доступа к данным) или Product (базовый класс)?

2 ответа

Решение

Учитывая шаблон, который вы используете, я думаю, что хорошей мысленной моделью для вас будет следующее:

Product представляет строку в базе данных - это простой старый объект C# (POCO), в котором нет ничего особенно умного. Это должна быть просто коллекция авто-свойств, как у вас в вашем примере.

ProductDa должно быть, где ваш доступ к данным происходит. Чтобы выяснить, обращаетесь ли вы к данным, вы должны спросить себя: "Запрошу ли я базу данных для реализации этого метода?" или "я буду использовать Dapper для реализации этого метода?" Если ответ "да", то взаимодействие с базой данных происходит в этом классе и его методах.

Что касается того, следует ли вам использовать LINQ Count() метод или связать свой собственный: на уровне доступа к данным, вам, вероятно, следует избегать связывания собственного метода для Count(), Уровень доступа к данным должен быть абстрагирован от деталей того, как вы запрашиваете базу данных; дальнейшие манипуляции потребителями вашего уровня доступа к данным (Count, Any, Firstи т. д.) все в порядке. Плюс, так как вы уже возвращаете List<Product>у вас есть доступ к List.Count свойство, так что это тривиальный доступ для звонящих.

Учитывая все это, я бы исправил ваш ProductDa класс следующим образом

public class ProductDa
{
    //CRUD operations using Dapper
    public List<Product> GetAllElements();
    //query database using Dapper to get all the elements where Value == value
    public List<Product> GetAllElementsWithValue(int value);
}

и потреблять класс следующим образом, чтобы получить количество Productс возвращено:

var dataAccess = new ProductDa();
var threeValuedItems = dataAccess.GetAllElementsWithValue(3);
int numberOfItems = threeValuedItems.Count;

или, говоря более кратко:

var dataAccess = new ProductDa();
var numberOfItemsWithValueThree = dataAccess.GetAllElementsWithValue(3).Count;

Не пиши ReturnCountValue метод, используйте LINQ вместо любого вашего метода в качестве Count. Я настоятельно рекомендовал репозиторий вместо DAL. Вот

Другие вопросы по тегам