За несколько месяцев я опубликовал несколько вопросов о структуре приложений ASP.NET и уровней Database-Abstraction-Layers для целей переписывания (с нуля) устаревшего веб-приложения. Я недавно наткнулся на MVC3 / Entity-Code-First и, потратив некоторое время с ним, влюбился в то, как он работает, как все абстрагируется, и я ищу любой повод для его использования!
Устаревшее приложение - это служба Windows C ++ / CLI, которая генерирует свой собственный HTML (очень старый HTML, в котором CSS используется только для цветов, а таблицы - в изобилии), а интерфейс очень тесно связан с бизнес-логикой. По сути, все будет улучшением.
Однако, и, возможно, это потому, что я еще не провел достаточно времени с MVC, у меня есть несколько ноющих сомнений и я удивляюсь, могут ли некоторые из вас, MVC-Pro, поделиться своим опытом в моем направлении.
Устаревшее приложение использует настраиваемые элементы управления (его собственная форма) для привязки комбинированных блоков к данным и динамического повторного заполнения зависимых комбинированных блоков на основе выборов в другом. В ASP.NET на этот вопрос легко ответить, поскольку на страницу просто добавляется элемент управления asp:DataList
, привязывается его к источнику данных и вуаля. Небольшой простой код позволяет затем фильтровать другие поля со списком по выбранному значению. В ASP.NET также было бы легко реализовать другой список данных, который бы даже автоматизировал зависимые данные таким способом (который очень хорошо имитировал бы поведение унаследованного приложения). Кажется, я не могу найти понятие пользовательских элементов управления в MVC, хотя я предполагаю, что такого рода вещи обрабатываются вызовами jQuery для получения данных и добавления их в поле со списком. Но сделано ли это для каждого поля со списком на каждой странице, которая имеет один? Это случай для частичных представлений с соответствующими параметрами, или это просто глупо?
Я предполагаю, что это больше относится к Entity Framework, чем к MVC, но большинство примеров, которые я нашел в Интернете, и учебные пособия выполняют запросы LINQ, чтобы вернуть коллекцию объектов для отображения, например, это из пример MvcMovie:
public ActionResult Index()
{
var movies = from m in db.Movies
where m.ReleaseDate > new DateTime(1984, 6, 1)
select m;
return View(movies.ToList());
}
Который затем визуализируется с использованием цикла @foreach
в представлении. Это все замечательно. Устаревшее приложение имеет одну страницу просмотра, которая используется всеми другими областями системы (их более 50). Это осуществляется путем проверки порядка столбцов, определенного для пользователя, вошедшего в систему, сглаживания любых внешних ключей (так что поле в сторонней таблице отображается в отличие от непригодного для использования значения первичного ключа), а также позволяет пользователю применять настраиваемые фильтры для любого столбца. Это делается также для таблиц, которые имеют более 100 тыс. Строк. Как можно написать что-то подобное, используя Entity-framework и views? В ASP.NET я, вероятно, решил бы эту проблему путем динамического генерирования какого-либо вида сетки, чтобы он автоматически генерировал столбцы и применял фильтры. Кажется, это может больше работать в MVC. Я что-то упустил?
Устаревшее приложение имеет несколько операций, которые работают с большими наборами данных. Теперь, поскольку это был сервис, он мог запускать эти потоки, не беспокоясь о завершении работы. Один из моих вопросов здесь о SO касался присутствия статических менеджеров и введения перезапуска AppPool, но я решил, что наличие вспомогательного сервиса - хороший вариант. При этом унаследованное приложение применяет оператор обновления к большим группам записей, а не к отдельным строкам. Возможно ли это с Entity-Framework без написания собственного SQL для базы данных, которая обходит обычные модели? Я надеюсь, что мне не нужно делать что-то подобное (не то, что я хотел бы, это только для примера)
var records = from rec in myTable
where someField = someValue
select rec;
foreach(rec in records)
rec.applyCalculation();
db.SaveDbChanges();
Я подозреваю, что это может занять много времени, тогда как унаследованное приложение просто сделает:
UPDATE myTable
SET field1 = calc
WHERE someField = someValue
Так что мне не совсем понятно, как мы используем наши модели таким образом.
Унаследованное приложение имеет несколько панелей данных в макете, которые переносятся на любую страницу, на которой вы находитесь. Глядя здесь на Stackoverflow, я нашел этот вопрос, который подразумевает, что каждый вид должен передавать эту информацию в макет? Это так или есть лучший способ? В идеале я хотел бы, чтобы мой макет имел доступ к конкретной модели / хранилищу и отображал данные на боковой панели. Добавление к каждой странице просмотра может быть довольно повторяющимся и подверженным ошибкам. Не говоря уже о времени, которое потребовалось бы, если бы мне нужно было что-то изменить. Здесь можно выполнить частичное представление, но, опять же, я не уверен, как передать ему модель на странице макета.
Наконец, после установки Ef-Code-First, я был разочарован тем, что действительно хороший атрибут SourceName
еще не сделал этого. Это было бы очень хорошо при сопоставлении с прежними таблицами / столбцами, и я не совсем уверен, почему он был опущен в данный момент (по крайней мере, мой intellisense говорит, что его там нет!) У кого-нибудь есть идея, когда это может произойти? Я мог бы обойтись без этого некоторое время, но в конечном итоге это было бы невероятно полезно.
Извините за длинные вопросы. После многих лет исследовательской работы в ASP.NET и MVC3 я действительно хочу перейти на MVC3!