2016-04-20 6 views
1

Я использую Dapper для заполнения моего класса с использованием класса Data Access. В этом классе я выполняю всю операцию CRUD.DataAccess Слой и класс, где я могу поместить свои функции?

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 (базовый класс)?

ответ

1

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

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; 
0

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

+0

Что делать, если мне нужно использовать этот LinQ много раз? Разве не лучше иметь его в одном месте, чтобы я мог также его протестировать? – SilentRage47

+0

Репозиторий является частью DAL, поэтому «Репозиторий вместо DAL» не очень точное предложение. Кроме того, ReturnCountValue может быть методом репозитория. –

+0

@MaximKosov Вы правы. Я хотел бы сказать «общий» репозиторий. –

Смежные вопросы