从方法返回模型(DTO)的最佳实践是什么?

时间:2019-06-01 07:26:08

标签: c# asp.net-mvc nopcommerce

当我经历Nop Commerce Source Code时,他们创建了Factories来转换Domain model in to View models

但是我看到一些工厂返回IList的方法,有些返回IEnumerable的方法,所以我有点困惑为什么这种不一致以及为什么不返回IEnumerable。

在Nop Commerce的旧版本中,我已经看到它们总是用来返回IEnumerable<Model>,但是现在在最新版本中,大多数视图模型都在IList中返回。我知道使用IList可以很好地工作抽象而不是具体的类型(列表),但是 IEnumerable更好,因为一切都是从它派生的。

现在这使我想知道从方法返回模型时要考虑哪种数据结构?

是否总是必须IEnumerable,因为所有内容都源自此接口,并且最重要的是始终与抽象配合使用?

代码:

public partial interface ICountryModelFactory
{
    IList<StateProvinceModel> GetStatesByCountryId(string countryId, bool addSelectStateItem);
} 

public partial interface IBlogModelFactory
{ 
   List<BlogPostYearModel> PrepareBlogPostYearModel(); // Now why Concrete List here?
}

public partial interface IProductModelFactory
{
  IEnumerable<ProductOverviewModel> PrepareProductOverviewModels(IEnumerable<Product> products,
            bool preparePriceModel = true, bool preparePictureModel = true,
            int? productThumbPictureSize = null, bool prepareSpecificationAttributes = false,
            bool forceRedirectionAfterAddingToCart = false);

  IList<ProductSpecificationModel> PrepareProductSpecificationModel(Product product);
}

在这里,我对于将域模型转换为视图模型时的最佳实践是什么以及返回视图模型时最适合使用哪种数据结构感到困惑?

从下面的方法中返回IEnumerable<MyModel>总是更好:

public IEnumerable<MyModel> ReturnMyModel(Product product){ } 

注意:这不是问IEnumerable与IList之间的区别的问题

Nop Commerce版本= 4.20

1 个答案:

答案 0 :(得分:0)

  

IEnumerable更好,因为一切都源于它。

我不认为这是考虑的方式。它既不好也不坏。它是不同的并且具有不同的目的。

IEnumerable

  • 某些结果集是无限的(或者太大而无法实际容纳到内存中)。在这种情况下,一一生成记录意味着无需处理整个记录就可以对其进行处理。
  • 某些结果集保存在实际上不是列表的内容中。可能是队列,字典键,哈希集或其他东西。返回为IEnumerable意味着该方法无需创建新的列表对象,只需将其填充数据即可返回客户端,而客户端可能永远不会打算对其进行任何操作。
  • 有时您可能会将数据包含在列表中,但不希望调用者修改该列表。如果数据是不可变的,则只需将列表作为IEnumerable返回即可,并且知道它们无法从源列表中添加/删除

IList

  • 有时该方法需要您构建列表,所以为什么不让调用者具有(有效)获得计数,按索引访问对象,添加,删除或排序元素的功能,而无需将其克隆到另一个新对象

我更喜欢从返回您可以提供给呼叫者的最有用的东西方面来考虑。如果我返回了一个IList,则可以将其分配给IEnumerable变量,或将其用作后续方法的IEnumerable参数的值。

因此,如果我已经将数据保存在List<T>中,并且很高兴您能对该列表进行突变,那么我将其返回为IList<T>。但是,如果我将数据存储在Queue<T>中,那么我将不遗余力地进行.ToList()调用并向其返回一个IList。如果您想要一个列表,可以自己做,但是如果您只是对其进行迭代,那么我的.ToList()“帮助”调用只会浪费大量的时钟周期和RAM。