我写了一个具体的类来公开数据库结果集,其中包括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);
答案 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。