Я перерабатываю архитектуру решения для реализации SOA .
После внесения изменений в конструкцию я придумал:
- MySolution.Client.MyProject.Web ...... //ASP.NET WebSite
- MySolution.Client.MyProject.Proxy .... // Проект библиотеки прокси-сервера службы C # * 1
- MySolution.Service ........................ //Service.cs для Service.svc здесь
- MySolution.Service.DataContract ...... //IService.cs для Service.cs здесь * [2]
- MySolution.Service.HttpHost .......... //Service.svc здесь
- MySolution.Model ..................... // Здесь представлены все пользовательские классы данных и модель EDMX * [3]
- MySolution.Repository ................ // Репозиторий запрашивает БД с помощью запросов LINQ и ADO.NET
* 1 MySolution.Client.MyProject.Proxy:
Этот проект содержит сервисный прокси и содержит классы презентаций
* [2] MySolution.Service.DataContract:
- Этот проект содержит IService и классы запросов / ответов
- Все методы в Service.cs принимают классы Request в качестве входных и возвращают классы Response в качестве выходных
- Поэтому на этот проект ссылаются 2 клиентских проекта (веб и прокси-сервер), поскольку он содержит IService и все классы запросов / ответов, которые потребуются для связи с Service.cs
* [3] MySolution.Model:
Этот проект содержит файл .edmx, представляющий собой модель данных Entity Framework, и некоторые пользовательские классы, используемые в проекте.
ПРОБЛЕМА:
Поскольку я использую только классы запросов / ответов для связи между службой и клиентом, проект MySolution.Service.DataContract используется только Service.cs и Repository.cs
И в связи с этим все ответы, которые генерирует Repository, должны отображать их в свойствах соответствующего класса ответа (что делает и исходную возвращаемую сущность, и класс ответа почти идентичными). Но я в порядке с этим ...
Например:
- Service.cs
- Метод GetCustomer () в хранилище выполняет запрос LINQ и возвращает объект «Клиент»
- Service.cs затем сопоставляет все свойства объекта «Клиент» с объектом «КлиентResponse»
- Service.cs затем возвращает «CustomerResponse» вызывающей стороне.
В этом случае большинство свойств будет повторяться в обоих классах. Если есть решение, это хорошо, в противном случае, я в порядке.
Однако при вызове метода Repository.cs GetCustomers () ( Обратите внимание, что это не GetCustomer () ), он вернет список объектов Customer, и отображение этого для целей возврата будет означать "для цикл ", который повторяет коллекцию и выполняет сопоставление ... Это НЕ О'КЕЙНО ...
Есть ли лучший способ сделать это, учитывая, что я не хочу возвращать объект "Customer" без "CustomerResponse", так как, во-первых, это нарушает архитектуру SOA, и, во-вторых, я не хочу, чтобы мои клиентские проекты имели какие-либо ссылка на модель или репозиторий проектов?