Контекст. Создание приложения интеллектуального клиента на платформе .NET, в котором используется сложная модель базы данных с большим количеством столбцов. Естественный стиль приложения - это типичный CRUD, управляемый данными. В некоторых случаях также присутствует немало логики на стороне сервера и несколько сложных проверок. Вы имеете полный контроль над клиентом и сервером, поэтому необходимость взаимодействия как минимум.
В этом вопросе много деталей, извинений за это, но это потому, что я хочу установить правильный контекст для ответов.
Еще несколько предположений
- Как не редкость в мире Microsoft, большинство предыдущих приложений были написаны с использованием DataSets, поэтому это самая известная технология для разработчиков. Но допустим, что разработчики хорошо разбираются и в ОО-мышлении.
- Вам нужно будет выполнить проверки как на клиенте, так и на сервере.
- Вы не показываете большинство данных в табличной форме.
- Это не приложение для интрасети, поэтому о пропускной способности не следует слишком много думать
Самый большой вопрос: наборы данных или объекты?
Если вы выбираете наборы данных, у вас есть несколько положительных и отрицательных значений
- С точки зрения положительных моментов: вы получаете небольшую поддержку Microsoft в плане извлечения данных из базы данных, получения данных по сети и возврата измененных данных по сети меньшими порциями - поскольку вы можете указать только отправку изменений. Отправка меньшего количества данных - это хорошо, так как потенциально может потребоваться совсем немного данных.
- Минусы: с точки зрения валидации, бизнес-логики и т. Д. Вы получаете процедурную форму кода и не получаете преимуществ объектно-ориентированного кода - поведение и данные вместе, более естественный стиль работы и размышлений о что вы делаете, и, возможно, более тесные связи с логикой проверки. Вы также можете отвести взгляд от преимущества размещения набора данных в сетке, поскольку это не обычный случай использования.
Если вы выбираете объекты, это та же самая тренировка, но есть и другие варианты:
Положительные стороны: поведение и данные вместе. Проверка логики ближе. Проще увидеть и понять отношения между объектами. Более читаемый код. Проще для модульного тестирования.
Но есть еще несколько вариантов и работа, которую вам необходимо выполнить:
OR / Mapping
- Получение данных от реляционной модели к объектам. OR-картографы не так сложны, и будут в состоянии справиться с этим. Но это увеличивает время разработки.
Карта контрактов
- Как правило, рекомендуется сопоставлять данные с серверных объектов контрактным объектам, вероятно, DTO. Поскольку это приложение хорошо подходит для архитектуры в стиле CRUD, DTO на самом деле не добавляет значимости картине, а только отображает работу.
Общий код
- Вы можете перейти к сценарию с общим кодом, где сборка с данными и логикой домена доступна как на стороне клиента, так и на стороне сервера. Это тесная связь, но это не обязательно плохо, если у вас есть естественно тесно связанная клиент-серверная программа.
Независимо от того, выбираете вы добавление слоя контракта или нет, у вас есть большие структуры объектов, которые должны быть отправлены по проводам.
Поскольку мы контролируем как клиента, так и сервер, транспорт и кодирование должны быть двоичным кодированием по TCP. Это поможет
С наборами данных у вас есть возможность только отправить изменения обратно. Отправка всей структуры объекта назад и вперед является вероятной проблемой производительности.
Возможность отправки всего объектаструктура, чтобы как-то идентифицировать вовлеченные изменения (Создать, Обновить, Удалить) и отправить только информацию об этом.Теоретически не так сложно отправить совокупный идентификатор корня на сервер и изменения, попросить сервер лениво загрузить объединенный корень, выполнить внесенные изменения, а затем снова сохранить.Но большая сложность связана с выявлением сделанных изменений.Вы когда-нибудь шли на такой подход?Зачем?Как именно ты это делаешь?
Презентация
Точная технология пользовательского интерфейса не так уж важна для вопроса, возможны WinForms, Silverlight или WPF.Давайте предположим, что мы используем WPF, поскольку это новый умный клиент.Это означает, что у нас есть двухстороннее связывание и мы можем правильно использовать MVVM.
Объекты, связанные с пользовательским интерфейсом, должны будут реализовывать INotifyPropertyChanged и вызывать событие при каждом обновлении свойства.Как вы решаете это?Если вы выберете сценарий общего кода, вы можете добавить его к объектам домена, но это будет включать добавление кода и логики на стороне сервера, которая никогда не предназначена для использования там.Разделение является более естественным, если вы выбираете объекты контракта, но это не так много добавленной стоимости только для добавления слоя отображения.
Технологии
Существует несколько технологий, которые могут помочь в решении некоторых проблем, но часто усложняют другие.Вы ими пользуетесь или сами строите вещи с нуля?**
- CSLA возможен, но он усложняет модульное тестирование и, по-видимому, добавляет более тесную связь с доступом к данным.Это помогает справиться с рядом проблем, но лично я не обладаю компетенцией в этой технологии, поэтому трудно сказать, подходит ли она.
- Услуги WCF RIA были бы возможны для решения Silverlight, ноЕсть определенные ограничения.Размер данных - один.
- WCF Data Services - это еще один подход к быстрому запуску чего-либо, но REST не сильно помогает, и вам также не хватает поддержки валидации, которую вы имеете в RIA Services.
Резюме
Если вы продвинулись так далеко, я надеюсь, у вас есть представление о том, куда я иду с этим.Я пытался ограничить его, чтобы не говорить обо всем сразу, но распределенная разработка сложна, поэтому вам нужно рассмотреть много частей.
Обновление
Спасибо за ответы, ребята!Я пытался задать вопрос достаточно открытым, чтобы открывать для разных ответов, но достаточно конкретным, чтобы справиться с несколькими весьма распространенными требованиями.
Существуют разные соображения, которые имеют разные плюсы и минусы, и которые варьируются от системы к системе.Каждый обычно добавляет сложность поиска решения.Одним из пунктов этих вопросов было получение ответов, в частности, с несколькими дополнительными требованиями, которые не обязательно соответствуют непосредственно одному ответу, который часто является правильным сегодня - с пользовательским интерфейсом на основе задач.Я не "CRUD-парень", если хотите.Но некоторые системы по разным причинам (чаще всего устаревшие) хорошо подходят для CRUD.
Многие бизнес-приложения имеют схожие требования, которые тянутся в разные стороны:
Связанные с бизнесом
- Просмотр: отображение данных для пользователя и обновление тех же данных (чтение и CUD - создание, обновление, Удалить)
- Проверка: бизнес-правила
Связанный с пользовательским интерфейсом
- Проверка: правила пользовательского интерфейса
- Обновления пользовательского интерфейса: код, относящийся только к обновлению пользовательского интерфейса при изменении объекта (INotifyPropertyChanged)
Связано с сетью
- Размер данных: количество данных, отправляемых по проводам
Связано с БД
- Ленивая загрузка
Связано с SRP / повторным использованием
-Сопоставление: вызвано несколькими слоями объектов / разделением проблем
Обслуживание / изменение, связанное
- Изменения: Добавление новой информации (столбцы / поля)
- Количество кода
- Повторное использование и "причины"изменить "
Техническийограничения
- Отслеживание изменений
Но это только некоторые очень специфические.Вам всегда нужно знать, какие «способности» вы считаете наиболее важными, и, следовательно, какую степень масштабируемости, доступности, расширяемости, функциональной совместимости, удобства использования, удобства обслуживания и тестируемости вам нужно.
Если бы я попытался обобщить что-то для большинства ситуаций, я бы сказал что-то вроде:
Клиент
- Используйте MVVM для разделения и тестирования
- Создайте виртуальную машину сверхуDTO
- Реализация INotifyPropertyChanged в ВМ.
- Использование XamlPowerToys, Postsharp или некоторых других способов помочь с этим может быть полезным
- Отдельные операции чтения и CUD в UI
- Создание задачи CUD на основеи используйте команды или аналогичные команды для отправки этих операций на серверную сторону
Сервер
- Индивидуальное создание dto для экрана
- ИЛИ используйте подход с несколькими запросами, описанный Ayende в http://msdn.microsoft.com/en-us/magazine/ff796225.aspx
- Используйте автоматическое преобразование, чтобы избежать утомительного, ручного и совершенно не связанного с проблемой, которую вы пытаетесь решить, шаг, который отображает
- Пусть модель предметной области главным образом связана с бизнес-операциями, включая операции, связанные с CUD,и не читается
- Избегайте повторного использования, что увеличивает количество причин для изменения
- Избегайте проблем с инкапсуляцией
- (И тем самым включить архитектуру стиля CQRS и, возможно, раздельное масштабирование операций чтения и CUD во времени)
- Попробуйте найти подход к проверке, который бы хорошо соответствовал тому, что должно быть сделано (Хорошее чтение: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/02/15/validation-in-a-ddd-world.aspx)
Это обязательно подход, который я выбрал бы в этой конкретной ситуации?
Ну, вот что я хотел начать обсуждение :) Но, похоже, это оказалось сложнее, чем я надеялся (кроме вас двоих).