У меня есть следующая иерархия классов для разрабатываемой платформы купонов и сделок: *
Promotion - abstract
- Coupon
- Sale
- Deal
( Купон , Продажа и Сделка Наследовать от Акции. Акция имеет строковый атрибут с именем type
и абстрактный метод, который инициализирует атрибуты типа подклассов строковым значением. Например, type
в купоне получает значение «Купон» и т.д ...)
Для каждого подкласса у меня есть DAO и Сервис классов, таких как CouponDAO
, CouponService
и т. Д.
В интерфейсных пользователях можно создать Купон или Продажа или Сделка через Угловой 2 интерфейс, поэтому я решил иметьследующие контроллеры:
PromotionController - abstract
- CouponController
- SaleController
- DealController
( CouponController , SaleController , DealController наследуются от PromotionController )
PromotionController
будет содержать все общие функции CRUD, общие для всех подклассов и в определенных контроллерахЯ буду обрабатывать конкретные операции, предназначенные для этих классов.
A) Проблема, с которой я сейчас сталкиваюсь, заключается в том, как создать экземпляр правильного объекта, поступающего со стороны клиента.Например, когда пользователь отправляет Купон или Продажа или Сделка , как создать экземпляр нужного объекта.Например, в PromotionController у меня есть такая функция ::
@RequestMapping(value=CREATE_PROMO, method=RequestMethod.POST)
public ResponseEntity<?> create(@RequestBody Promotion promotion){
promotionService.save(promotion);
return new ResponseEntity<>("", HttpStatus.OK);
}
Promotion , которая является абстрактным аргументом функции.Нужно ли использовать фабричный шаблон и атрибут **type**
для создания нужного объекта?Например, если type = "Coupon" , тогда я создаю объект Coupon, если это "Sale" , тогда я создаю объект Sale
B) Поскольку контроллериспользует объекты Services, это означает, что я должен объявить все три объекта служб в PromotionController .Потому что после создания экземпляра нужного объекта мне нужно вызвать соответствующий сервис для выполнения этой работы.В приведенном выше методе у меня есть PromotionService, который, я думаю, должен быть заменен правильным сервисом подкласса
C) Я ищу, как обращаться с API REST, который работает с подклассами в реальном мире, как ситуация, которую я описалвыше
D) Я думал об упрощении для себя путем копирования всех операций CRUD на их конкретные контроллеры, но, похоже, это будет повторяющийся код.
Я думаю, что есть лучший способ сделать это.
Я также пытался найти проект с открытым исходным кодом, который имеет дело с этими ситуациями, но, кажется, все проекты, которые я нашел, используютодин класс а не наследство.Их REST / API не обрабатывают ситуации наследования