asp.net mvc как полноценный сервис и приложение? - PullRequest
1 голос
/ 25 апреля 2009

В настоящее время я работаю над небольшим приложением в asp.net mvc. Это своего рода инструмент локализации. Наши клиенты входят в наше приложение и могут переводить термины, которые отображаются в наших приложениях, которые они используют. Это происходит так:

  1. вход на сайт локализации
  2. найти и перевести некоторые термины, например, заголовок кнопки в приложении «Каталог»
  3. запускают это приложение (например, приложение «Каталог» из 2.) и через веб-службы обновляют локальную базу данных терминов с помощью переведенных

Это наше старое решение, и оно отлично работает. Но сейчас я занимаюсь рефакторингом приложения-переводчика в asp.net mvc и думаю, почему у нас есть отдельная логика (удвоенная) в mvc и в веб-сервисах? Почему мы не можем использовать только mvc в качестве веб-службы ... таким образом, у меня есть только одна логика (выборка элементов и обновление), и нам не нужно создавать веб-службу wcf или что-то в этом роде. И самое главное, у меня нет сеточных настольных приложений с зависимостью от DLL, в которых у меня есть эта логика.

А теперь вопрос. Что я могу получить от контроллера в mvc, кроме представлений и JsonResults ... могу ли я получить коллекции своих объектов напрямую?

Или, более простой вопрос, как я могу использовать asp.net mvc в качестве веб-сервисов. Каков ваш опыт?

веселит Марко

Ответы [ 2 ]

2 голосов
/ 25 апреля 2009

Это действительно зависит от ваших потребностей. Скорее всего, вы можете использовать приложение ASP.NET MVC в качестве службы данных, но, похоже, вы должны использовать свой общий код в общей библиотеке и ссылаться на эту библиотеку в обоих приложениях. В проектах веб-служб есть некоторые вещи, которые будут более сложными исключительно в качестве действия контроллера. (де / сериализация, WSDL и т. д ...)

1 голос
/ 28 апреля 2009

Это действительно зависит от того, что будет использовать ваш веб-сервис.

Например: jQuery хорошо использует JsonResults, потому что я могу возвращать сложные объекты (с коллекциями, массивами, вложенными объектами и т. Д.) Из действия и иметь возможность десериализации jQuery обратно в объект javascript для использования в браузере клиентов. Конечно, вы теряете безопасность типов в процессе сериализации, но это вполне ожидаемо в большинстве веб-сервисов на основе REST / SOAP. Если вам действительно нужна безопасность типов для потребляющего приложения, придерживайтесь WCF (или подобного).

Я бы просто создал флаг, чтобы вернуть действие как Json. Я заметил, что несколько сайтов делают это таким образом. Скажем, у вас есть это действие:

    public ActionResult GetPeople()
    {
        IList<Person> result = svc.GetPeople();

        return View(result);
    }

.. результат этого действия обычно отображается в некотором представлении. Это здорово, но если вы хотите использовать действие в качестве веб-службы, вы можете просто изменить его на следующее:

    public ActionResult GetPeople(string ajax)
    {
        IList<Person> result = svc.GetPeople();

        if (Convert.ToBoolean(ajax))
            return Json(result);
        else
            return View(result);
    }

.. так что если ваше приложение-потребитель не возражало против сериализованного Json, то вместо того, чтобы вызывать GET-запрос, подобный этому http://domain.com/controller/GetPeople (как бы браузер получал View), вы просто добавили бы флаг ajax, например, http://domain.com/controller/GetPeople?ajax=true вернуть Json. Более подходящим флагом может быть «json» вместо «ajax» - «ajax» является распространенным, потому что этот метод используется для поддержки браузеров нижнего уровня для действий, которые могут вызываться с помощью ajax.

Я некоторое время думал о том, чтобы добавить это в мое приложение mvc, но мне не нравится идея модифицировать каждое действие с этим флагом и добавлять больше операторов if. Моя идея состоит в том, чтобы создать пользовательский атрибут для украшения действий, для которых вы хотите эту функциональность, и атрибут динамически добавляет дополнительный флаг и условно возвращает данные модели в виде Json, а не то, что было изначально указано. Попробуй.

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