我们有以下存储库方法
public IList<Foo> GetItems(int fooId, int pageIndex, int pageSize
, string sortField, string sortDir, out int totalItems)
{
// Some code
}
我的问题是:以这种方式使用out
是否可以。我对out
感到有些不舒服,但无法想出一个更好的方法来将其作为一个电话来写。
答案 0 :(得分:1)
这个怎么样?
public class ItemsList
{
public IList<Foo> Items { get; set; }
public int TotalCount { get; set; }
}
public ItemsList GetItems(int fooId, int pageIndex, int pageSize, string sortField, string sortDir)
{
return new ItemsList { Items = ..., TotalCount = ... };
}
您也可以存储其他信息。
public class ItemsList
{
public IList<Foo> Items { get; set; }
public int TotalCount { get; set; }
public string SortField { get; set; }
public string SortDirection { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
}
甚至可以创建一个通用类。
答案 1 :(得分:1)
我找到了我正在寻找的答案,但不是来自评论。谢谢你的帮助。
事实证明,MVC大师Rob Conery不久前发布了关于使用PagedList的信息。这是优雅的模式,根据博客,ScottGu已经在演示中使用它。基本上,您不是使用IList<T>
和List<T>
,而是使用IPagedList<T>
和PagedList<T>
。 PagedList<T>: List<T>, IPagedList<T>.
public interface IPagedList
{
int TotalCount { get; set; }
int PageIndex { get; set; }
int PageSize { get; set; }
bool IsPreviousPage { get; }
bool IsNextPage { get; }
}
还有更多代码,请查看Rob的博客。
答案 2 :(得分:0)
我不明白你为什么要在一次通话中这样做。如果您需要针对单独的总计数调用优化存储库往返,我相信您过早地进行微优化,除非您已经测量了此特定调用是您的性能问题。如果你已经测量了它,那么我认为你的存储库存在更大的问题。
我个人会在上面公开Count
的同一个对象上坚持使用简单的GetItems
属性。
更新:要解决您的问题,有理由不将其设计为单个电话:
它使您的API更复杂,更模糊。 GetItems()
主要意图(如上所述)是处理单页项目;为项目总数添加out
参数会超出语义。
这是需要考虑的事项 - 如果我只关心项目的总数,我是否需要致电GetItems
或者是否会有单独的方法?如果有一个单独的方法,为什么有两种方法可以访问相同的信息,是否可能会返回不同的结果?如果没有单独的结果,为什么我必须获取整页记录才能获得存储库中项目的总数?