Каковы лучшие практики для возврата моделей (DTO) из метода? - PullRequest
2 голосов
/ 01 июня 2019

Пока я просматривал Исходный код Nop Commerce , они создали Фабрики , которые преобразуют Domain model in to View models.

Но я вижу, что некоторые методы возвращают фабрики IList, некоторые возвращают IEnumerable Так что я немного запутался, почему это несоответствие и почему бы не вернуть IEnumerable.

В более старых версиях Nop Commerce я видел, что они всегда используют для возврата IEnumerable<Model>, но теперь в последних версиях большинство моделей представлений возвращаются в IList. Я знаю, с IList лучше работать вместо этого с абстракцией конкретного типа (List), но тогда 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 голосов
/ 01 июня 2019

IEnumerable намного лучше, потому что из него все вытекает.

Я не думаю, что это способ думать об этом.Это не лучше и не хуже.Это отличается и служит другой цели.

IEnumerable

  • Некоторые наборы результатов бесконечны (или просто слишком велики, чтобы вписаться в память).В таких случаях выдача записей по одной означает, что они могут быть обработаны без необходимости реализовывать весь набор в памяти.
  • Некоторые наборы результатов содержатся в чем-то, что на самом деле не является списком.Может быть, это очередь или ключ словаря, хэш-сет или что-то еще.Возврат в качестве IEnumerable означает, что методу не нужно создавать новый объект списка, заполните его данными только для того, чтобы вернуть клиента, который, возможно, никогда не намеревался делать что-то большее, чем просто foreach.
  • Иногдау вас могут быть данные в списке, но вы не хотите, чтобы вызывающий абонент изменял этот список.Если данные неизменны, вы можете просто вернуть свой список как IEnumerable и знать, что он не может добавить / удалить из вашего списка источников

IList

  • Иногда метод требовал от вас построения списка, так почему бы не дать вызывающей стороне возможность (эффективно) получить счетчик, получить доступ к объекту по индексу, добавить, удалить или отсортировать элементы без клонирования его в еще один новый объект

Я предпочитаю думать об этом с точки зрения возврата самой полезной вещи, которую вы можете предоставить вызывающей стороне.Если я верну вам IList, вы можете присвоить его переменной IEnumerable или использовать его в качестве значения параметра IEnumerable последующего метода.

Так что, если у меня уже есть данные в List<T>,и я рад, что вы изменили этот список, тогда я верну его как IList<T>.Но если у меня есть данные в Queue<T>, я не собираюсь изо всех сил делать вызов .ToList() и возвращать вам их IList.Если вам нужен список, вы можете сделать это самостоятельно, но если вы просто выполняли его итерацию, тогда мой .ToList() «полезный» вызов просто потратил целую кучу тактов и оперативной памяти.

...