首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承和REST控制器-处理子类

继承和REST控制器-处理子类
EN

Stack Overflow用户
提问于 2018-06-04 20:27:45
回答 3查看 5.9K关注 0票数 10

我有以下的优惠券和交易平台正在开发的等级:

代码语言:javascript
复制
Promotion - abstract
 - Coupon
 - Sale
 - Deal

(优惠券SaleDeal继承促销。升级有一个名为type的字符串属性和一个将子类的类型属性初始化为字符串值的抽象方法。例如,优惠券中的type获取“优惠券”等值.)

对于每个子类,我都有一个DAO和服务类,比如CouponDAOCouponService等等。

在前端用户可以创建优惠券、SaleDeal,通过角2接口,因此我决定使用以下控制器:

代码语言:javascript
复制
PromotionController - abstract
 - CouponController
 - SaleController
 - DealController

(CouponControllerSaleControllerDealControllerPromotionController继承)

PromotionController将包含所有子类共有的所有公共CRUD函数,而在特定控制器中,我将处理针对这些类的特定操作。

( A)现在面临的问题是如何实例化来自客户端的正确对象。例如,当用户提交优惠券SaleDeal时,如何实例化正确的对象。例如,在PromotionController中,我有一个如下所示的函数:

代码语言:javascript
复制
@RequestMapping(value=CREATE_PROMO, method=RequestMethod.POST)
    public ResponseEntity<?> create(@RequestBody Promotion promotion){
        promotionService.save(promotion);
        return new ResponseEntity<>("", HttpStatus.OK); 
    }

抽象的促进是函数的论证。我应该使用工厂模式和**type**属性来创建正确的对象吗?例如,如果type="Coupon"然后创建优惠券对象,如果它是" Sale ",则创建Sale对象

( B)由于控制器使用服务对象,这意味着我必须声明PromotionController.中的所有三个服务对象因为在实例化正确的对象之后,我需要调用其相应的服务来完成工作。在上面的方法中,我有promotionService,我认为应该用正确的子类服务来替换它。

C)我正在寻找如何处理REST,这些API处理现实世界中的子类,就像我前面描述的情况一样。

( D)我想通过将所有CRUD操作复制到它们的特定控制器来简化自己的操作,但这似乎是重复的代码。

我认为还有更好的办法可以做到。

如果我能找到一个处理这种情况的开源项目,我也试过了,但是我发现的所有项目似乎都使用一个类,而不是继承。他们的REST/API不处理继承情况

EN

回答 3

Stack Overflow用户

发布于 2018-06-04 21:08:14

在我看来,不要让端点变得简单。从REST的角度出发,创建单个或仅一个控制器,并在控制器层之后使用以下模式。据我所见,最好让REST端点远离继承/重用,并在接收和验证请求之后应用它。

若要从控制器实例化服务/助手层,请使用工厂方法模式:

pattern

创建一个PromotionServiceFactory,它根据升级类型返回PromotionService实现。

在控制器中,使用工厂调用相应的升级服务方法。工厂仍然接受类型升级的参数。

代码语言:javascript
复制
@RequestMapping(value=CREATE_COUPON, method=RequestMethod.POST)
    public ResponseEntity<?> create(@RequestBody Promotion promotion){
//helper if adding one more helper layer. The factory invocation is then //transferred to the helper layer
  PromotionService couponService = promotionServiceFactory.get(PROMOTYPES.COUPON);
couponService.save(promotion);
        return new ResponseEntity<>("", HttpStatus.OK); 
    }

从您的问题来看,对于不同的促销类型,似乎有一些常见的CRUD/其他方法。这是一个很好的候选模板模式在服务层,如果一些步骤/子任务是相同的,为每次提升,而其他的变化。否则,您可以通过创建抽象的升级服务来存储常见的CRUD方法。

pattern

使用常见CRUD方法的主要方法和实现创建抽象的升级服务。使用各自的不同方法创建其他促销服务类型的单独实现。

票数 4
EN

Stack Overflow用户

发布于 2018-06-04 20:44:59

根据逻辑,我认为你可以用两种方式来处理这个问题。如果你想把所有东西分开,那么为优惠券/交易/销售创建一个不同的端点。这样,每个端点都将调用其控制器,依此类推。

2)如果您认为代码是相同的,可以使用抽象工厂模式来实例化正确的服务和DAO对象。

这取决于您的业务需求,如果代码逻辑几乎相同的话,我更喜欢第二种方式。每个继承都有一个控制器,这样以后如果层次结构增加,您就不需要在需要之前创建多个类。

票数 0
EN

Stack Overflow用户

发布于 2019-03-15 15:35:32

要回答您(A),我认为您可以使用requestObject.instanceOf()方法,告诉正确的子类类型,然后用正确的处理程序处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50688285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档