返回C#中的泛型类型数据库结果集

时间:2017-02-27 08:09:35

标签: c# oop interface generic-list

我写了一个具体的类来公开数据库结果集,其中包括T型列表项和总行数。经过一些阅读(依赖性反转原则,接口隔离原则),我发现它应该作为接口而不是具体类公开。

以下是我的代码,将此类编写为IDbResultSet并将其公开为DbResultSet的最佳方法是什么。

public class DbResultSet<T>
{
    public List<T> Items { get; private set; }
    public int TotalRowCount { get; private set; }

    public DbResultSet(List<T> items, int totalRowCount)
    {
        this.Items = items;
        this.TotalRowCount = totalRowCount;
    }
}

用法:

DbResultSet<Category> GetCategory(int categoryId);

1 个答案:

答案 0 :(得分:1)

你无能为力。这只是关于设计界面:

Items

如上所述,整个界面没有定义的ICollection<T>集合类型:它可以是任何实现public class DbResultSet<T, TCollection> : IDbResultSet<T, TCollection> where TCollection : ICollection<T> { public TCollection Items { get; private set; } public int TotalRowCount { get; private set; } public DbResultSet(TCollection items, int totalRowCount) { // Note that qualifying with "this" is redundant here // so I've removed it Items = items; TotalRowCount = totalRowCount; } } 的集合。

现在你可以按如下方式实现它:

ResultSet

BTW,我建议您应该将界面和类名从Result更改为public interface IDbResult<T, TCollection> where TCollection : ICollection<T> { TCollection Items { get; } int TotalRowCount { get; } } public class DbResult<T, TCollection> : IDbResultSet<T, TCollection> where TCollection : ICollection<T> { public TCollection Items { get; private set; } public int TotalRowCount { get; private set; } public DbResult(TCollection items, int totalRowCount) { // Note that qualifying with "this" is redundant here // so I've removed it Items = items; TotalRowCount = totalRowCount; } } ,因为 set >是一个集合类型,其中没有订单,但集合项唯一

IDbResult<Category, IList<Category>> GetCategories();

因此,您可能会将结果显示为接口类型:

 DbResultSet<Category> GetCategory(int categoryId);

有人建议

我发现即使对于单个结果,您也希望使用该方法:

public interface IMultipleDbResult<T, TCollection>
       where TCollection : ICollection<T>
{
     TCollection Items { get; }
     int TotalRowCount { get; }
}

public interface ISingleDbResult<T>
{
      T Item { get; }
}

我的建议是,您应该将结果拆分为两个家庭

  • 单一结果。
  • 多重结果。

所以我最终会得到这些接口:

Id

我建议你这样做,因为你知道你正在通过IDbResult<Category, IList<Category>> result = GetCategoryById(389); Category category = result.Items[0]; // ?????? // vs. ISingleDbResult<Category> result = GetCategoryById(389); Category category = result.Item; // Isn't it more elegant? 获得一个类别,这很奇怪,你可能需要从列表中获取它:

TotalRowCount

顺便说一句,我知道您的实际解决方案涉及在两种结果类型上实现更多属性。例如,收集数据库查询错误消息或其他有用数据。

另一方面,我猜你正在实现像Items这样的属性,因为你正在对结果进行分页。例如,第一页可能有300个类别,但ICollection<T>属性包含 10个项目。否则,您的推理存在一些缺陷,因为Count的所有实现都已拥有TINYINT(1)属性。

最后,也许对我在网上发表的一些设计模式感兴趣。请参阅Accmulated Result design pattern