Могу ли я избежать дублирования своего бизнес-уровня? (.СЕТЬ) - PullRequest
1 голос
/ 03 января 2012

У меня есть технологическое демонстрационное приложение для написания с несколькими клиентами: веб-клиент (ASP MVC 3), настольный клиент (в настоящее время это будет приложение WCF, планирующеепопробуйте это позже в Metro) и мобильный клиент (Wp7 - задание по умолчанию, но если я чувствую себя миллионером времени, я мог бы также попробовать MonoDroid)

Я думал использоватьWCF для клиентов.
Я думал об использовании EF Model First для бэк-энда.
Однако моя проблема возникает, когда я пытаюсь выяснить, куда поместить мою доменную логику (проверку, вычисленные свойства и т. Д.), Не имеячтобы вручную дублировать все, что я уже объявил в моей модели EF.

Моя первая главная проблема заключается в том, что в EF встроено удобное отслеживание объектов (obj.Components.Add(...); db.Save();), но эта функция не доступна на клиентской стороне.Есть ли способ обойти это без необходимости реализовать свой собственный?(Я знаю, как это сделать, но это слишком много работы для этой демонстрации)

Моя вторая главная проблема (как следует из названия) - это логика предметной области, в основном проверки.

  • Должен ли я перекомпилировать бизнес-объекты на стороне клиента и сериализовать wcf в те же объекты?
  • Стоит ли пытаться работать с классами, созданными WCF на стороне клиента?(возвращаясь к первой проблеме)
  • Стоит ли пытаться использовать общие сборки?

  • Если я записываю свою логику в контроллеры MVC, моя служба WCF выиграла 'Я не могу их аккуратно называть.

  • Если я напишу отдельный BusinessLayer, должен ли он также использовать сущности EF или я должен написать собственные бизнес-объекты?(по сути, все повторяется снова)
  • Если я использую EF-сущности, мне придется частично проверять валидацию, что некрасиво (на данный момент, я должен сначала просто переключиться на EF-код?)
  • Есть ли хороший способ использовать те же проверки на стороне клиента?

  • Стоит ли полностью отказаться от этого и попробовать службы RIA?

О, так много вопросов ...

1 Ответ

3 голосов
/ 03 января 2012

Ранее я создавал кроссплатформенные приложения для Windows (в частности, клиенты WPF / Silverlight, серверная часть C # SQL Server), и вот что я сделал.

  • Используется уровень обмена сообщениями или промежуточное программное обеспечение (RabbitMQ для асинхронного обмена сообщениями или веб-сервисы для запроса / ответа) и технология сериализации (Protobuffers или JSON), которая работает через все три границы.По возможности используйте межплатформенное промежуточное ПО.Вот почему я упоминаю RabbitMQ / protobuffers / JSON.
  • Перенес всю бизнес-логику на сервер - клиент вообще не может получить доступ к базе данных и должен пройти через промежуточное ПО.Клиенты, включая настольные, буквально становятся тонкими браузерами, получающими доступ к службам промежуточного программного обеспечения для всех операций.
  • Созданы общие сборки для хранения сообщений, контрактов данных и общих классов между клиентом (ами) и сервером, на которые могут ссылаться все клиенты исервер.

Этот последний шаг (общие сборки) включает создание 1 проекта, полностью совместимого с C # (так работает на WPF Desktop или Server) и дополнительных проектов для каждого веб-клиента (Silverlight, WP7).Для двойного развертывания кода на нескольких клиентах у вас есть одна копия исходного кода в сборке рабочего стола, а затем «Добавить как ссылку» те же исходные файлы в сборки Silverlight / WP7.Вам нужно будет иметь несколько операторов препроцессора #if, но в общем и целом можно использовать двойное развертывание больших кусков кода, используя этот метод.

Ваш стек становится

Клиенты:

все клиенты имеют сериализацию, реализации на стороне клиента веб-сервисов / промежуточного программного обеспечения и шаблоны MVVM / MVC

Промежуточное ПО:

Реализация промежуточного ПО на рабочем столе сервера / wpf может быть одинаковой.Wp7, monodroid и т. Д. Должны отличаться

Messages / DataContracts:

для всех клиентов / серверов, используя методы, описанные выше

Сервер:

Все реализации бизнес-логики, доступа к БД и промежуточного программного обеспечения на стороне сервера.Для доступа к БД я использовал PetaPoco как отличный MicroORM.Я полагаю, переполнение стека полномочий реализации microORM, но я могу ошибаться.

Я бы также взглянул на эту статью для вдохновения.Это возможно - я написал клиент-серверные приложения с клиентами SL / WPF и C #, а также с клиентскими / Java-серверами WPF, используя описанные выше методы.

С уважением,

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