C# 数据访问层和类,我把我的函数放在哪里?
我正在使用数据访问类填充我的类。在这门课上,我做所有的积垢操作C# 数据访问层和类,我把我的函数放在哪里?,c#,dapper,data-access-layer,C#,Dapper,Data Access Layer,我正在使用数据访问类填充我的类。在这门课上,我做所有的积垢操作 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>
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();
}
在这个函数中,我将调用我的getAllegements
,然后使用LINQ返回所需的值
我想知道的是,我应该把
ReturnCountValue
函数放在哪里:ProductDa
(数据访问层)或Product
(基类)?不要编写任何ReturnCountValue
方法,使用LINQ代替任何方法作为Count。我强烈建议使用存储库而不是DAL 鉴于您所使用的模式,我认为以下是您的良好心理模型:
Product
表示数据库中的一行——它是一个普通的旧C#object(POCO),没有什么特别聪明的地方。它应该只是一个自动属性的集合,就像您在示例中所做的那样
ProductDa
应该是您进行数据访问的地方。为了弄清楚您是否正在访问数据,您应该问自己“我将查询数据库以实现此方法吗?”或者“我将使用Dapper实现此方法吗?”如果答案是肯定的,那么与数据库的交互将在该类及其方法中进行
至于您应该使用LINQ的Count()
方法还是捆绑自己的方法:在数据访问级别,您可能应该避免捆绑自己的Count()
方法。数据访问层应该是关于抽象出如何查询数据库的细节;数据访问层的使用者的进一步操作(Count
,Any
,First
等)是可以的。另外,由于您已经返回了一个列表
,因此您可以访问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);
}
或者,更简洁地说:
var dataAccess = new ProductDa();
var numberOfItemsWithValueThree = dataAccess.GetAllElementsWithValue(3).Count;
如果我需要多次使用LinQ怎么办?把它放在一个地方,这样我就可以对它进行单元测试了,这不是更好吗?存储库是DAL的一部分,所以“存储库而不是DAL”不是很准确的句子。此外,ReturnCountValue可能是存储库的方法。@MaximKosov您是对的。我想告诉一个“通用”存储库。@SilentRage47是的,您可以多次使用LinQ。它适用于单元测试,而您有一个通用存储库接口,该接口具有成员计数、计数(IPredicate)。你可以轻松地模仿这种方法。
var dataAccess = new ProductDa();
var threeValuedItems = dataAccess.GetAllElementsWithValue(3);
int numberOfItems = threeValuedItems.Count;
var dataAccess = new ProductDa();
var numberOfItemsWithValueThree = dataAccess.GetAllElementsWithValue(3).Count;