Servicestack – архитектура и повторное использование POCOs для всего

Я имею в виду использование документации ServiceStack для использования POCOs:

Поскольку он продвигает чистый, повторно используемый код, ServiceStack всегда поощрял использование кодовых POCO для почти всего.

т.е. можно использовать один и тот же POCO:
В запросе и ответе DTO (на клиенте и сервере)
В текстовых сериализаторах JSON, JSV и CSV
В качестве модели данных в OrmLite, db4o и NHibernate
Поскольку объекты, хранящиеся в Redis
Как капли, хранящиеся в кэшах и сеансах
Выпущено и выполнено в сервисах MQ ”

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

В частности, я борюсь с архитектурной идеей возвращения объекта ответа, который также является моделью данных (как было предложено SS). Идея разделить озабоченность слишком сильно укоренилась во мне. Не будет ли у вас проблем в будущем, если вы будете использовать одни и те же POCO для всего. Разве это не «безопаснее», например, возвращать, например, объекты просмотра?

Самый большой враг программного обеспечения

Во-первых, я хочу повторить, что основы Complexity и Large Code являются единственным злейшим врагом разработки программного обеспечения и что наряду с удовлетворением требований проекта (т. Е. Получения ценности от нашего программного обеспечения), управлением сложностью и поддержанием минимального и низкого трения, база должна быть на переднем крае наших умов, поскольку мы постоянно совершенствуем наше программное обеспечение с новыми функциями и требованиями. Любые рекомендации, правила или процессы, которые мы добавляем для повышения качества программного обеспечения, должны быть непосредственно сосредоточены на управлении его существенной сложностью. Одной из лучших вещей, которые мы можем сделать для снижения сложности, является уменьшение размера базы кода, то есть DRYing повторяемого кода и устранение любых ненужных абстракций, косвенности, понятий, типов и трений, которые не являются абсолютно необходимыми для функции программного обеспечения.

В этом свете YAGNI является одним из лучших принципов для обеспечения простой и бережливой базы кода, сосредоточив внимание на том, что необходимо для обеспечения ценности.

Избегайте правил одеяла

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

Будьте осторожны с неверными правилами и шаблонами

Даже шаблоны проектирования программного обеспечения во многих случаях являются недостатками языка программирования , где то, что полезно на одном языке, не является необходимым и более элегантным решением на более выразительных и мощных языках. Аналогичным образом, с «правилами», то, что является предостерегающим руководством в одном домене, может быть неприменимым в других. Поэтому более важным, чем «правило», является ценность, которую он фактически обеспечивает, и какой конкретный побочный эффект он пытается предотвратить. Как только мы поймем его истинную ценность, мы можем оптимизировать для получения максимального значения от него и вместе с YAGNI, знать, когда его выборочно применять.

Простая жизнь POCO

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

Тяжелые модели ORM являются бедными DTO

Не повторное использование моделей данных в качестве DTO применимо к Heavy ORM, которые поощряют модели данных с циклическими зависимостями и прокси-объектами с жесткой связью и встроенной логикой, которые могут вызвать непреднамеренный доступ к данным N + 1, что делает эти модели бедными кандидатами для использования в качестве DTO и почему вы всегда должны скопируйте их в специальные DTO, которые ваши службы могут вернуть, поэтому они могут быть сериализованы без проблем.

Очистить POCO

Сложные модели данных, хранящиеся в OrmLite или Redis , не страдают от каких-либо из этих проблем, которые могут использовать чистые, отключенные POCOs. Они слабо связаны друг с другом, где важна только «Форма» POCO, то есть перемещение проектов и изменение пространств имен не будет влиять на сериализацию, то, как она хранится в таблицах РСУБД, структурах данных Redis, поставщиков кэширования и т. Д. также не связанные с конкретными типами, вы можете использовать другой тип для вставки данных в OrmLite, чем то, что вы используете для его чтения, и не должно быть «точной фигуры», поскольку OrmLite может заполнять DTO только подмножеством поля, доступные в базовой таблице. Также нет различия между таблицей, представлением или хранимой процедурой, OrmLite с радостью сопоставляет любой результат с любыми соответствующими полями на указанном POCO, игнорируя другие.

Эффективно это означает, что POCOs в ServiceStack чрезвычайно устойчивы и совместимы, поэтому вы можете без проблем повторно использовать те же DTO в OrmLite и наоборот. Если модели DTO и Data немного отклоняются, вы можете скрыть их от сериализации или сохранения в OrmLite с атрибутами ниже:

public class Poco { [Ignore] public int IgnoreInOrmLite { get; set; } [IgnoreDataMember] public int IgnoreInSerialization { get; set; } } 

В противном случае, когда вам нужно их разделить, например, в таблицу РСУБД было добавлено больше полей, чем вы хотите вернуть, DTO включает дополнительные поля, заполненные из альтернативных источников, или вы просто хотите, чтобы ваши службы проецировали их по-разному. В этот момент (YAGNI) вы можете взять копию DTO и добавить ее в свою Реализацию Услуг, чтобы они могли расти отдельно, беспрепятственно из-за их различных проблем. Затем вы можете легко конвертировать между ними, используя
Встроенное автоматическое отображение ServiceStack , например:

 var dto = dbPoco.ConvertTo(); 

Встроенное автоматическое сопоставление также является очень толерантным и может сочетать свойства с различными типами, например, в / из строк, различными типами коллекций и т. Д.

Объекты передачи данных – DTO

Поэтому, если вы используете чистые, сериализуемые POCOs без внешних зависимостей (например, из источников OrmLite, Redis или alt ServiceStack), вы можете с радостью повторно использовать их как DTO и свободно реорганизовывать их в разные модели как и когда вам нужно. Но когда вы повторно используете Модели данных в качестве DTO, их все равно следует поддерживать в проекте ServiceModel (также как DTO .dll), который должен содержать все типы , возвращаемые вашей службой. DTO должны быть логическими и зависимыми, поэтому единственная зависимость, на которую ссылается проект ServiceModel, – это беспроблемная ServiceStack.Interfaces.dll, которая, как и PCL .dll, может свободно ссылаться со всех платформ .NET Mobile и Desktop .

Вы хотите, чтобы все типы, возвращаемые службами, находились в DTO .dll, так как это вместе с базовым URL-адресом того, где размещаются ваши службы, – это все, что требуется, чтобы ваши потребители услуг знали, чтобы потреблять ваши Сервисы. Что они могут использовать с любым из .NET Service Clients для получения сквозного типизированного API без кода-гене, инструментария или любого другого искусственного оборудования. Если клиенты предпочитают исходный код вместо этого, они могут использовать ссылку Add ServiceStack Reference для доступа к DTO на серверах, выбранных на их предпочтительной платформе и выбранном языке.

Сервисы

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

Интерфейс DTO vs Реализация услуг

DTO – это то, что определяет ваш контракт на услуги, сохраняя их изолированными от любой реализации сервера, – как ваша Служба может инкапсулировать свои возможности (которые могут быть неограниченной сложности) и сделать их доступными за удаленным фасадом. Он отделяет то, что предоставляет ваш сервис, от сложности его реализации. Он определяет API для вашей службы и сообщает потребителям услуг минимальную информацию, которую им нужно знать, чтобы узнать, какие функции предоставляют ваши Сервисы и как их использовать (поддерживая аналогичную роль для файлов заголовков в исходном коде C / C ++). Четкие контракты на обслуживание, отделенные от реализации, обеспечивают совместимость, гарантирующую, что ваши службы не предусматривают конкретные реализации клиентов, гарантируя, что они могут быть использованы любым HTTP-клиентом на любой платформе. DTO также определяют форму и структуру вашего проводного формата услуг, обеспечивая их чистое десериализацию в собственные структуры данных, что устраняет усилия по ручному анализу служб.

Разработка параллельных клиентов

Поскольку они фиксируют весь контракт, он также позволяет клиентам разрабатывать свои приложения до того, как Сервисы будут реализованы, поскольку они могут привязать свое приложение к его конкретным моделям DTO и могут легко высмеять их Service Client для возврата тестовых данных до тех пор, пока внутренние службы .

Что касается правил, то обеспечение четко определенного контракта на обслуживание (DTO), отделяемого от его реализации, идет в сущность того, что такое Сервис и его ценность.

Запросы и ответы DTO

Что касается того, какие DTO делают хорошие кандидаты для повторного использования в качестве моделей данных, вы не хотите использовать Request DTO для чего-либо иного, кроме определения внешнего API-интерфейсов служб, который обычно является глаголом, который идеально сгруппирован по семантике вызовов и типам ответов , например:

 public class SearchProducts : IReturn { public string Category { get; set; } public decimal? PriceGreaterThan { get; set; } } 

Ваши таблицы RDBMS обычно являются сущностями, определенными как существительные , т.е. то, что возвращает ваша Служба:

 public class SearchProductsResponse { public List Results { get; set; } public ResponseStatus ResponseStatus { get; set; } } 

Даже содержащая Response DTO, которая определяет, что возвращает ваша Служба, не является хорошим кандидатом для повторного использования в качестве модели данных. Обычно я использую дискретные DTO для Service Responses, поскольку он позволяет свободно распространять существующие Сервисы для возврата дополнительных данных или метаданных без нарушения существующих клиентов.

Помимо DTO с запросами и ответами, все остальные типы , возвращаемые вашей службой, будут кандидатами на повторное использование в качестве моделей данных, которые я часто делаю, сохраняя их в проекте ServiceModel по вышеуказанным причинам.

Interesting Posts

Является ли fgets () возвратом NULL с коротким буфером?

Преобразование строки в тип с нулевым значением (int, double и т. Д.)

Объединить данные гироскопа и акселерометра

Лучший способ определить источник замедления домашней сети?

C # получить тип нулевого объекта

Получить подписи экспортируемых функций в DLL

Добавить разделитель в строку на каждый N символов?

Создать Out-Of-Process COM в C # /. Net?

Как игнорировать начальную загрузку при просмотре изменений модели в AngularJS?

Autostart MySQL Server в Mac OS X Yosemite / El Capitan

Как избежать дублирования кода, реализующего константные и неконстантные iteratorы?

Могу ли я использовать эффект onclick в CSS?

Как включить Samsung EVO 840 mSATA SSD Self-Encrypting Drive с Intel RST RAID 0

Один монитор работает точно так же, как двойной монитор?

Почему Windows 7 иногда забывает отключить мой дисплей после X минут, даже если настройки мощности специально настроены таким образом?

Давайте будем гением компьютера.