当我经历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
答案 0 :(得分:0)
IEnumerable更好,因为一切都源于它。
我不认为这是考虑的方式。它既不好也不坏。它是不同的并且具有不同的目的。
IEnumerable
IList
我更喜欢从返回您可以提供给呼叫者的最有用的东西方面来考虑。如果我返回了一个IList,则可以将其分配给IEnumerable变量,或将其用作后续方法的IEnumerable参数的值。
因此,如果我已经将数据保存在List<T>
中,并且很高兴您能对该列表进行突变,那么我将其返回为IList<T>
。但是,如果我将数据存储在Queue<T>
中,那么我将不遗余力地进行.ToList()
调用并向其返回一个IList。如果您想要一个列表,可以自己做,但是如果您只是对其进行迭代,那么我的.ToList()
“帮助”调用只会浪费大量的时钟周期和RAM。