Вот как это сделал.
В настоящее время я пользуюсь услугами Silverlight + PRISM + MVVM + WCF (RIA).
С текущей архитектурой проекта
- Application.Domain: Содержит все первые сущности кода EF, включая метаданные и проверку бизнеса. Не включает генерацию базы данных.
Application.RIAServices: Этот проект содержит автоматически созданные классы из веб-проекта служб RIA WCF. Я могу сослаться на этот проект как в WPF, так и в Silverlight.
Application.RIAServices.Web: веб-проект, содержащий DomainServices и код создания базы данных с использованием DbContext. это ссылочный проект WCF RIA для Application.RIAServices
Application.Infrastructure: это то, где это начинается. Потому что, как и у вас, у меня есть Служба поддержки персонала / клиентов, использующая интерфейс ICustomerService. Поскольку я хочу использовать этот сервис, например, для всего приложения, а не только для ModuleA, я помещаю этот интерфейс в инфраструктуру. Все проекты содержат ссылку на этот проект.
Application.Modules.ModuleA -> Application.Modules.ModuleD: Общие модули, обеспечивающие функциональность. Все мои модули (которые используют службы WCF RIA) имеют ссылку на проекты Application.Infrastructure и Application.RIAServices.
Application.Shell: запуск проекта. наличие загрузчика и регистрация всех соответствующих модулей.
Чтение вопроса Рэйчелс заставило меня задуматься о некоторых вещах, и я просто хотел оставить свою структуру о том, как я это сделал. Вы можете иметь представление об этом. Я пока не хочу идти в DTO, потому что такие вещи, как валидация, настолько хорошо интегрированы в сервисы RIA WCF, что автоматически отображают в текстовом поле, когда что-то не так, и отображают сообщение об ошибке. Будем рады услышать ваше мнение и результаты вопроса / проблемы
Edit:
Application.Domain также имеет отдельную структуру.
У меня есть мои модели. Только контейнер чистых свойств, которые должны быть сопоставлены с базой данных. Тогда у меня есть папка с метаданными. Теперь, чтобы это работало, мне нужно иметь то же пространство имен, что и у моей сущности, и я делаю эту сущность частичной. Я создаю файл Entity.metadata.cs и там я создаю internal sealed class EntityMetaData
, копируя свойства и добавляя к ним атрибуты. Используя атрибут MetadataType
над классом Entity, он добавляет все эти атрибуты в генератор кода EF / WCF RIA.
Одним из этих атрибутов является CustomValidation
, он использует статический класс и параметр метода и проверяет сущность на сервере. Или, если вы создаете файл с расширением .shared.cs, он создается в проекте Application.RIAServices.
Возможность
Чтобы попытаться ответить на ваш вопрос, у вас может быть только 1 вариант, и это то, что вы предложили сначала. Вы можете создать проект Customer.Infrastructure.
этот проект содержит интерфейс для ICustomerService, Entity / DTO / POCO, что вы когда-либо захотите, и, возможно, даже реализацию этого ICustomerService или службы WCF. Это позволяет всем вашим модулям ссылаться на этот проект и, следовательно, не создавать зависимости между модулями.