Уровень и класс 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. Вот