Возвращаемый тип как IEnumerable вместо просто List?
//controller
var a = new Dictionary<string, string>();
return View(a);
var b = new List<string>();
return View(b);
var c = new LinkedList<string>();
return View(c);
// All work with:
@model IEnumerable<string>
При использовании IEnumerable<>
больше Open Принципы sOlid Я редко рекомендую передавать интерфейс или класс любого типа коллекции в представление.
В то время как в C # массивы / коллекции граждан первого класса проблема заключается в том, что они не расширяемы при сохранении Принцип единой ответственности .
Например:
// Controller Returns:
var people = .... as IEnumerable<Person>;
return View(people);
@model IEnumerable<Person>
Теперь предположим, что нужно добавить в представление любую информацию, которая не имеет никакого отношения к группе (например, заголовок).на страницу) .. как ты это делаешь?Вы можете расширить и создать свой собственный класс, производный от IEnumerable<T>
, но это нарушает SRP, поскольку заголовок страницы не имеет ничего общего с группой людей.Вместо этого вы должны создать первоклассную модель, которая представляет все, что нужно представлению:
public class MyViewModel
{
public string Title { get; set;}
public IEnumerable<Person> People { get; set;}
}
return View(myViewModel);
@model MyViewModel
Я предлагаю всегда делать это.Как только вы начинаете использовать частичные или шаблоны в MVC или хотите отправить обратно тот же объект, становится все труднее отойти от IEnumerable<>
, потому что вам нужно изменить Partials и / или Шаблоны и / или Javascript ...
Итак, мой вопрос: почему в MoviesController
в приватном методе GetMovies()
используется тип возврата IEnumerable<>
?
Как правило, это хорошая практика Программа против интерфейса, а не реализация , также называемая Проектирование по контракту (DbC), также известное как программирование по контракту, программирование по контракту и программирование по контракту, .
Это принцип soLid в частности принцип подстановки Лискова.Выдержка:
Подстановочность - это принцип объектно-ориентированного программирования, утверждающий, что в компьютерной программе, если S является подтипом T, объекты типа T могут быть заменены объектами типа S (т.е. объект типа T может быть заменен любым объектом подтипа S) без изменения каких-либо желательных свойств программы (корректность, выполненная задача и т. д.).Более формально, принцип подстановки Лискова (LSP) - это конкретное определение отношения подтипов, называемое (сильным) поведенческим подтипом, которое было впервые введено Барбарой Лисков в основном выступлении на конференции в 1987 году под названием «Абстракция и иерархия данных».Это семантическое, а не просто синтаксическое отношение, поскольку оно призвано гарантировать семантическую совместимость типов в иерархии, в частности, типов объектов.Барбара Лисков и Джаннет Уинг вкратце описали этот принцип в статье 1994 года следующим образом ...
На практике это означает текущий код:
public ActionResult Index()
{
var movies = GetMovies();
return View(movies);
}
private IEnumerable<Movie> GetMovies()
{
return new List<Movie>
{
new Movie {Id = 1, Name = "Shrek"},
new Movie {Id = 2, Name = "LotR"}
};
}
Может измениться на:
public class MoviesController : Controller
{
private readonly IMovieDb _movieDb;
// Dependency Injecting access to movies
public MoviesController(IMovieDb movieDb)
{
_movieDb = movieDb;
}
public ActionResult Index()
{
var movies = _movieDb .GetMovies();
return View(movies);
}
// ....
public interface IMovieDb
{
IEnumerable<Movie> GetMovies();
}
Теперь мы понятия не имеем, как извлекаются фильмы ... и нас не должно волновать, пока контракт / интерфейс удовлетворяет наши потребности в данных.