ASP.Net MVC с веб-сервисом в качестве модели? - PullRequest
8 голосов
/ 02 июня 2009

У кого-нибудь есть советы или рекомендации по использованию веб-службы в качестве модели в приложении ASP.Net MVC? Я не видел, чтобы кто-нибудь писал об этом. Я хотел бы создать приложение MVC, но не привязывать его к использованию конкретной базы данных и не ограничивать базу данных одним приложением MVC. Я чувствую, что веб-сервис (RESTful, скорее всего ADO.Net Data Services) - это путь.

Ответы [ 4 ]

28 голосов
/ 03 июня 2009

Насколько вероятно или полезно, чтобы приложение MVC было отделено от вашей базы данных? Как часто вы видели за время жизни вашего приложения переход с SQL Server на Oracle? За последние 10 лет проектов, которые я реализовал, этого никогда не было.

Архитектура подобна луку, у нее есть слои абстракций над вещами, от которых они зависят. И если вы собираетесь использовать СУБД для хранения данных, это лежит в основе вашей архитектуры. Абстрагирование себя от БД, чтобы вы могли поменять его местами, является большой ошибкой.

Теперь вы можете отделить доступ к вашей базе данных от вашего домена, и шаблон репозитория является одним из способов сделать это. В настоящее время большинство зрелых решений используют ORM, поэтому, возможно, вы захотите взглянуть на NHibernate, если вам нужна зрелая технология, или на ActiveRecord / linq2sql для упрощенного шаблона активной записи поверх ваших данных.

Теперь, когда у вас есть стратегия обработки данных, у вас есть какой-то домен. Когда вы предоставляете данные своему клиенту, вы можете сделать это с помощью шаблона MVC, где вы обычно будете отправлять DTO, сгенерированные из вашего домена, для рендеринга, или вы можете использовать архитектурный стиль, такой как REST, для предоставления более слабосвязанных систем. , предоставляя ссылки и пользовательские представления.

При переходе к внешним слоям раствора вы переходите от жесткой связи к более слабой связи.

Если ваш вопрос, однако, заключался в том, чтобы создать приложение MVC поверх архитектуры REST или веб-служб и использовать его в качестве модели ... Зачем беспокоиться? Если у вас будет доменная модель, почему бы не использовать ее в вашей системе и в ваших службах там, где это имеет смысл?

Генерирование пользовательского интерфейса из приложения MVC и генерация документов, необходимых для архитектуры RESTful, - это два совершенно разных контекста, основание друг на друге просто вызовет гораздо больше боли, чем необходимо. И вы жертвуете производительностью.

Зависит от вашего точного сценария, но удаленный сервис на основе XML, как модель в MVC, из опыта, не очень хорошая идея, вероятно, это чрезмерное проектирование и игнорирование необходимости запуска домена.

3 голосов
/ 02 июня 2009

Вы должны определять свои модели независимо от доступа к данным, например, используя шаблон репозитория. Затем вы можете создавать конкретные реализации, опирающиеся на определенные технологии доступа к данным (Web-сервис, SQL и т. Д.).

3 голосов
/ 02 июня 2009

Редактировать 2010-11-27; прояснил мои мысли, которые действительно были необходимы.

Веб-сервис предоставляет функциональность для различных типов приложений, а не для абстракции в одном приложении, чаще всего. Вы, вероятно, думаете о способе инкапсуляции команд и чтения таким образом, который не мешает программированию вашего контроллера / представления.

Используйте сервис из служебной шины, если вы хотите отделиться и выполните асинхронный шаблон на ваших асинхронных страницах. Вы можете увидеть Rhino.ServiceBus, nServiceBus и MassTransit для собственных реализаций .Net и RabbitMQ для чего-то другого http://blogs.digitar.com/jjww/2009/01/rabbits-and-warrens/.

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

Вы также можете просто предоставить сервисные интерфейсы. Прочитайте Эрик Эван, управляемый доменом, для более подробного описания.

Сервисные интерфейсы REST-ful имеют дело с данными, а точнее с адресуемыми ресурсами. Это может значительно упростить вашу программную модель и дает отличный контроль над выводом по протоколу HTTP. Предстоящая модель программирования WCF использует истинный отдых, как определено в исходном тезисе, где каждый документ должен в некоторой степени предоставлять URI для продолжения навигации. посмотрите на это . (В моей первой версии этого поста я оплакивал REST как «медленный», что бы это ни значило) API на основе REST также в значительной степени используются в CouchDB и Riak .

ADO.Net - это довольно дерьмо (!) [N + 1 проблем с отложенным сбором данных из-за кода для реализации, утечки доступа к данным - вам всегда нужен контекст БД, где находится код запроса и т. Д.), По сравнению с пример LightSpeed ​​(коммерческий) или NHibernate. Spring.Net также позволяет вам обернуть интерфейсы сервисов в их содержимое фасадом веб-сервиса, но (не просматривая его некоторое время), я думаю, что он немного перегружен в своей конфигурации.

Редактировать 1: Под ADO.Net здесь я подразумеваю «лучшую практику» по умолчанию с DataSets, DataAdapter и итерацией большого количества строк из DataReader; это порождает довольно уродливый и трудный для отладки код. Да, N + 1 - это структура сущностей.

(Редактировать 2: EntityFramework меня тоже не впечатляет!)

Редактировать 1: Создайте свой доменный слой в отдельной сборке [aka. Core] и предоставьте там все доменные и прикладные сервисы, затем импортируйте эту сборку из вашего конкретного приложения MVC. Оберните доступ к данным в некотором DAO / Repository через интерфейс в вашей базовой сборке, на который затем ссылается и реализует ваша сборка данных. Подключите интерфейс и реализацию с IoC. Вы даже можете запрограммировать что-то для динамического обнаружения услуг с помощью вышеупомянутых сервисных шин, чтобы решить для интерфейсов. WCF использует такие интерфейсы, как и большинство вышеупомянутых сервисных шин; вы можете предоставить субкомпонентрезольвер в вашем контейнере IoC, чтобы сделать это автоматически.

Редактировать 2: Отличным комбо для вышеперечисленного будет CQRS + EventSourcing + ReactiveExtensions. Ваша модель записи будет принимать команды, ваша модель домена будет решать, принимать ли их, она будет отправлять события в конвейер реактивных расширений, возможно, также через RabbitMQ, который будет использовать ваша модель чтения.

Обновление 2010-01-02 (правка 1)

Шутка моей идеи была записана чем-то под названием MindTouch Dream. Они сделали скринкаст, где рассматривают почти все части веб-приложения как (веб) -сервис, который также предоставляется с помощью REST.

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

Всем недоброжелателям в этом вопросе перед вами лицо: р! Послушайте этот скриншот, , особенно в 12 минут.

Фактические рамки здесь.

Если вы занимаетесь программированием такого типа, посмотрите , как работают монады и их реализации в C # . Вы также можете прочитать о CoRoutines .

С новым годом!

Обновление 2010-11-27 (правка 2)

Оказалось, что CoRoutines были созданы с помощью параллельной библиотеки задач от Microsoft. Ваша задача теперь реализует те же функции, что и IAsyncResult. Caliburn - это крутой фреймворк, который их использует.

Реактивные Расширения подняли понимание монады на следующий уровень асинхронности.

Мир ALT.Net, кажется, движется в направлении, о котором я говорил, когда писал этот ответ впервые, хотя с новыми типами архитектур, о которых я мало знал.

0 голосов
/ 30 ноября 2011

Это действительно зависит от размера этого проекта MVC. Я бы сказал, чтобы пользовательский интерфейс и домен оставались в одной рабочей среде, если веб-сайт будет использоваться небольшим числом пользователей (<5000). </p>

С другой стороны, если вы планируете создать сайт, к которому будут обращаться миллионы, вы должны думать о распределении, а это значит, что вам нужно создать свой сайт таким образом, чтобы он мог масштабироваться. Это означает, что вам может понадобиться использовать дополнительные серверы (Интернет, приложение и база данных).

Чтобы это работало хорошо, вам необходимо отделить ваш сайт mvc UI от приложения. Уровень приложений обычно содержит модель вашего домена и может быть открыт через WCF или служебную шину. Я бы предпочел служебную шину, потому что она более надежна и может использовать постоянные очереди, такие как msmq.

Надеюсь, это поможет

...