Мне нужна помощь с дизайном моей службы WCF.У меня есть метод, который возвращает Products
из базы данных.В пользовательском интерфейсе у меня есть следующие опции для группировки продуктов:
Нет / Группировка по умолчанию: возвращает список всех Products
.
Группировка производителей: возвращает список всех Products
в зависимости от конкретного производителя.
Налогооблагаемая группировка: возвращает список всех Products
, которые подлежат налогообложению.
Ниже приведена вся структура моего ответа:
<ResponseStruct>
<!-- Grouping is done on product-->
<ProductList>
<Product>
<Name></Name>
<Taxability>
<Value></Value>
</Taxability>
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
</ManufacturerList>
</Product>
<Product>
<Name></Name>
<Taxability>
<Value></Value>
</Taxability>
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
</ManufacturerList>
</Product>
</ProductList>
<!-- Grouping is done on taxability of product-->
<TaxabilityList>
<Taxability>
<Value></Value>
<ProductList>
<Product>
<Name></Name>
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
</ManufacturerList>
</Product>
<Product>
<Name></Name>
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
</ManufacturerList>
</Product>
</ProductList>
</Taxability>
<Taxability>
<Value></Value>
<ProductList>
<Product>
<Name></Name>
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
</ManufacturerList>
</Product>
<Product>
<Name></Name>
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
</Manufacturer>
</ManufacturerList>
</Product>
</ProductList>
</Taxability>
</TaxabilityList>
<!-- Grouping is done on manufacterur-->
<ManufacturerList>
<Manufacturer>
<Name></Name>
<City></City>
<ProductList>
<Product>
<Name></Name>
<Taxability>
<Value></Value>
</Taxability>
</Product>
<Product>
<Name></Name>
<Taxability>
<Value></Value>
</Taxability>
</Product>
</ProductList>
</Manufacturer>
<Manufacturer>
<Name></Name>
<City></City>
<ProductList>
<Product>
<Name></Name>
<Taxability>
<Value></Value>
</Taxability>
</Product>
<Product>
<Name></Name>
<Taxability>
<Value></Value>
</Taxability>
</Product>
</ProductList>
</Manufacturer>
</ManufacturerList>
</ResponseStruct>
Сейчас я решил эту проблему следующим образом: сначала я определил отдельные классы модели для своего ответа.
1. Product
- Name
- Taxability
- IList<Manufacturer>
2. Taxability
- Value
- IList<Product>
3. Manufacturer
- Name
- City
- IList<Product>
Для варианта использования 1 (группировка по умолчанию) я оставляю закрытые теги ManufacturerList и TaxabilityList в ответ и заполняю объект ProductList только из базы данных.Для варианта использования 2 (группировка по производителю) я оставляю ProductList и TaxabilityList закрытыми в ответе и заполняю только объект ManufacturerList.
Пример ответа для варианта использования 3:
<ResponseStruct>
<ProductList/>
<ManufacturerList/>
<TaxabilityList>...</TaxabilityList>
</ResponseStruct>
Нужна помощь:
Приведенный выше пример, который я создал, демонстрирует мою проблему.В действительности существует 5 вариантов группировки, и запрос ввода пользователя может иметь 2 уровня группировки (он может отправить его в массиве объекта группировки в запросе), и это приводит к 20 возможным форматам ответа.
Существуетпроблема с моей реализацией.У меня есть три слоя в моем сервисе, и когда я получаю ввод, я устанавливаю флаг после просмотра атрибута группировки во входном запросе под слоем проверки ввода, который позже используется бизнес-уровнем, где я форматирую атрибут группировки, основанный на ответе из ввода, это становилось грязнымиз-за большого количества операторов if, поэтому я создал разные классы форматирования ответов, которые реализуют интерфейс, но меня беспокоит то, что я создал слишком много классов, потому что мне нужно создать несколько форматов ответов (20).
Есть ли какой-то шаблон дизайна предмета или предложения, которые я могу прочитать, чтобы решить мою проблему?
Возможно, я подхожу к своей проблеме совершенно неправильно, поэтому буду признателен за любое решение.