Мне нравится структурировать свои решения WCF следующим образом:
Контракты (библиотека классов)
Содержит все контракты на обслуживание, операции, неисправности и данные. Может использоваться совместно сервером и клиентом в чистом сценарии .NET-to-.NET. Это место, куда вы бы поместили свои классы структуры данных, чтобы все проекты в вашей экосистеме могли использовать это.
Реализация службы (библиотека классов)
Содержит код для реализации сервисов и любые вспомогательные / вспомогательные методы, необходимые для достижения этой цели. Ничего другого.
Сервисный хост (ы) (необязательно - может быть Winforms, Консольное приложение, NT Service)
Содержит сервисные хосты для отладки / тестирования или, возможно, также для производства.
Это, в основном, дает мне серверную часть вещей.
На стороне клиента:
Клиентские прокси (библиотека классов)
Мне нравится упаковывать свои клиентские прокси в отдельную библиотеку классов, чтобы их можно было повторно использовать в нескольких реальных клиентских приложениях. Это можно сделать с помощью svcutil или «Добавить ссылку на службу» и вручную настроить получившиеся в результате ужасные файлы app.config или выполнить ручную реализацию клиентских прокси (при совместном использовании сборки контрактов) с использованием конструкций ClientBase<T>
или ChannelFactory<T>
.
1-n реальных клиентов (любое приложение)
Как правило, будет ссылаться только на сборку прокси-клиентов или сборку контрактов, если она используется совместно. Это могут быть ASP.NET, WPF, Winforms, консольное приложение, другие службы - вы называете это.
Таким образом; У меня хороший и чистый макет, я использую его последовательно снова и снова, и я действительно думаю, что это сделало мой код чище и проще в обслуживании.
Это было вдохновлено фильмом Мигеля Кастро Экстремальный WCF на DotNet Rocks TV с Карлом Франклином - очень рекомендуется снимать экран!