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;