【问题标题】:DataAccess Layer and class, where do I put my functions?数据访问层和类,我将函数放在哪里?
【发布时间】:2016-08-13 06:30:34
【问题描述】:

我正在使用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(基类)?

【问题讨论】:

    标签: c# dapper data-access-layer


    【解决方案1】:

    鉴于您使用的模式,我认为适合您的良好心智模型如下:

    Product 代表数据库中的一行——它是一个普通的旧 C# 对象 (POCO),没有什么特别聪明的地方。它应该只是一个自动属性的集合,就像你在你的例子中一样。

    ProductDa 应该是您的数据访问发生的地方。要弄清楚你是否正在访问数据,你应该问自己“我会查询数据库来实现这个方法吗?”或者“我会使用 Dapper 来实现这个方法吗?”如果答案是肯定的,那么与数据库的交互将在该类及其方法中进行。

    至于您应该使用 LINQ 的 Count() 方法还是捆绑您自己的方法:在数据访问级别,您可能应该避免为 Count() 捆绑您自己的方法。数据访问层应该是抽象出你如何查询数据库的细节;数据访问层的消费者(CountAnyFirst 等)的进一步操作是可以的。另外,由于您已经返回了List&lt;Product&gt;,因此您可以访问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);
    }
    

    并按如下方式消费该类以获取返回的Products的数量:

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

    或者,更简洁地说:

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

    【讨论】:

      【解决方案2】:

      不要编写任何ReturnCountValue 方法,使用 LINQ 代替您的任何方法作为 Count。我强烈推荐 Repository 而不是 DAL。 here

      【讨论】:

      • 如果我需要多次使用那个 LinQ 怎么办?把它放在一个地方不是更好,这样我也可以对它进行单元测试吗?
      • Repository 是 DAL 的一部分,所以“Repository 而不是 DAL”这句话不是很准确。此外,ReturnCountValue 可以是存储库的方法。
      • @MaximKosov 你是对的。我想告诉一个“通用”存储库。
      • @SilentRage47 是的,您可以多次使用 LinQ。当你有一个通用存储库接口有成员 Count、Count(IPredicate) 时,它适用于单元测试。你可以轻松地模拟这个方法。
      猜你喜欢
      • 2010-12-15
      • 1970-01-01
      • 2017-05-09
      • 2011-06-02
      • 2010-12-14
      • 1970-01-01
      • 2012-02-23
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多