Котельная плита для проекта WCF, ожидается версия - PullRequest
5 голосов
/ 15 июня 2011

Я все больше и больше начинаю понимать, как использовать WCF для проектов, которые я внедряю для внутреннего использования (автоматизация задач компании, обеспечение того, чтобы все клиенты находились на одной странице и т. Д.) Это во многом связано с 3-10 клиентов Я автоматизирую сразу, когда внедряю решение, и (даже если это была небольшая выборка) компания растет, что постоянно увеличивает число клиентов в пуле и, следовательно, повышает требования к надежности / согласованности.С учетом вышесказанного я осознаю, насколько важно убедиться, что я делаю вещи расширяемыми, поскольку (раньше) продвижение релиза становилось все труднее, чем больше клиентов у меня зависит от службы.

Мой последний проект имеетпотенциал экстернализации.До сих пор я делал это так, как я знаю, работает, но я все еще хотел бы идти по «правильному» пути в плане будущих обновлений.Как мне настроить файл проекта, чтобы сделать его максимально простым и понятным, чтобы поддерживать его в актуальном состоянии и расширять?Должен ли я помещать номера версий в пространство имен (как в Company.Interfaces.Contracts.June2011.IMyService), используя псевдопапки, ...?

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

Есть ли у кого-либо с таким опытом какой-либо опыт?мысли, предложения, рекомендации в этой области?Буду очень признателен за любые примеры, книги, документацию и т. Д., Которые вы можете предоставить.


Обновление (06-17-2011)

Чтобы дать некоторое представление, я такжеищу некоторые конкретные вопросы.К ним относятся:

  1. Как вы украшаете класс обслуживания по сравнению с DTO с точки зрения пространства имен?Я видел http://service.domain.com/ServerName/Version, используемый в самом классе Service, и http://types.domain.com/ServiceName/Version, используемый в DTO.Это распространено?(Разделить пространство имен на коллекцию типов и служб?)
  2. Должен ли я реализовывать IExtensibleDataObject для всех своих объектов на том основании, что они могут быть эволюционированы в будущем выпуске?(Создайте основы для работы сейчас)
  3. Если в моей базе данных есть ограничения (например, для длины строки), я должен расширить IParameterInspector и использовать этот метод для валидности (с разделением логики и валидации), исправьте?
  4. Должен ли "фактический сервис" быть разбит на свой собственный класс, чтобы, как и в I версии, классы контракта на обслуживание просто вызывали код (сохраняя каждую новую версию с минимально возможным кодом?) Илия должен держать его в классе обслуживания и наследовать от него с помощью любых новых методов (аналогично, что произойдет, если вы удалите метод?)

Извините, если у меня много вопросов, япросто посмотрите на два конца спектра в документации.Я вижу «Настройка wcf», а затем непосредственно «это WCF с контролем версий» - никаких переходов / шагов между ними.Я предполагаю, что это будет просто "щелкнуть", как только я получу достаточно информации, но я (к сожалению) еще не там.


tl; др

Когда вы начнете писать службу WCF, которая, как вы знаете, будет проходить несколько итераций, как вы настроите свой проект (ы), чтобы сделать его как можно более простым в будущем (для себя и партнеров по команде)?

1 Ответ

2 голосов
/ 17 июня 2011

Я добился успеха, используя "строгую" политику управления версиями (кажется, что в любом случае вы движетесь в этом направлении), когда вы просто создаете новую конечную точку / точки каждый раз, когда выпускается новое определение. Это означает, что у вас не будет проблем с обратной совместимостью по контракту для устаревших клиентов - старые версии можно легко отключить, как только в журнале будет указано, что все клиенты обновлены. Однако, как правило, необходимо писать мостовой код для любых унаследованных конечных точек, чтобы они могли продолжать вызывать измененную бизнес-логику.

Что касается организации проекта, я бы создал новый проект для каждой версии, чтобы их можно было легко развертывать отдельно. Пространства имен, использующие v1, v2, обычно работают достаточно хорошо. Имена конечных точек могут также включать номер версии, который должен легко отличать их друг от друга.

В качестве альтернативы вы можете попробовать использовать «слабую» политику управления версиями, в которой вы можете иметь возможность добавлять или удалять элементы данных, внедряя интерфейс IExtensibleDataObject во все ваши службы. Некоторые полезные ссылки на статьи MSDN можно найти в популярном ответе на похожий вопрос: Клиент WCF и версия .

Другой вариант «слабого» типа - больше двигаться к решению для обмена сообщениями (которое WCF может поддерживать посредством контрактов сообщений и / или привязки MSMQ). Здесь подкаст от SOA-гуру Уди Дахана, который дает интересную перспективу и определенно стоит послушать - нет IDog2 .

Наконец, вот хороший пост в блоге с некоторыми более детальными рекомендациями по любой стратегии, которую вы в конечном итоге используете: http://wcfpro.wordpress.com/2010/12/21/wcf-versioning-guidelines-2/.

...