Переписать устаревшее проприетарное веб-приложение в MVC3 / Entity-Code-First - PullRequest
7 голосов
/ 30 января 2011

За несколько месяцев я опубликовал несколько вопросов о структуре приложений 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!

Ответы [ 2 ]

3 голосов
/ 30 января 2011

Если бы мне удалось правильно извлечь вопросы, то это был бы мой ответ:

  1. Вы правы в своих размышлениях о раскрытии основных данных (или других элементов управления, если на то пошло),JQuery AJAX / JSON вызовы (в основном GET) будут тем, что вам нужно.Если у вас есть только один раскрывающийся список на вашей странице, то, конечно, вам не нужен такой тип интерактивности - вы можете просто подготовить модель для него в действии вашего контроллера (вы создаете объект SelectList).

  2. Здесь вы, скорее всего, в конечном итоге будете использовать какую-то сеточную систему, такую ​​как jqGrid или Flexigrid.Они делают большую часть вещей, касающихся фильтрации / поиска / запросов сами.Тем не менее, вам придется предоставить действия контроллера JSON, которые будут обслуживать данные.

  3. Да, вы можете выполнять SQL через EF.Там ExecuteStoreQuery() и ExecuteStoreCommand().Подробнее об этих http://msdn.microsoft.com/en-us/library/ee358769.aspx

  4. Вы можете вызвать RenderAction() из представления, и это действие подготовит данные по требованию (всякий раз, когда вы их вызываете) и отобразит частичное (или нормальное) представление.и передать данные (модель) к нему.RenderPartial() немного более неуклюже с этим - требуется, чтобы у вас уже была модель, доступная в представлении, в котором вы звоните RenderPartial().RenderPartial() никогда не возвращается к действию контроллера - он просто отображает HTML, определенный в шаблоне, используя модель, которую вы указали в его вызове, из представления.

  5. К сожалению, я неНе знаю ответа на этот вопрос.

HTH

1 голос
/ 08 февраля 2011

Возможно, вам это не понравится, но было бы гораздо разумнее просто провести рефакторинг приложения c ++. Особенно для бизнеса. Там нет ничего плохого в создании HTML. Гораздо проще выполнить рефакторинг для современных html / css, чем набор шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...