[英]Call different Service api's based on the entity object in spring framework
我正在使用Spring框架设计的Web服务应用程序上工作,在这里我有从基类“ activity”继承的不同实体类(ActivityA,ActivityB,ActivityC ...)
现在,我在服务层中为基类和所有子类编写了不同的服务api。 (例如,ActivityService,ActivityAService,ActivityBService,ActivityCService ..)
所有对每个活动操作类似的方法都放在基类(ActivityService)的服务api中,并置于各自的服务中。
我通常知道我正在处理哪个对象,因此我分别调用了服务api。 但是在特定情况下,我有活动对象(不知道它是哪个子类),并且必须编写一个对于所有实体对象都不同的方法。
问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,不是服务,我无法进行任何硬编码来获取服务对象)
但是在特定情况下,我有活动对象(不知道它是哪个子类),并且必须编写一个对于所有实体对象都不同的方法。
只需将基类抽象化并定义每个子类必须实现的抽象方法:
public abstract class ActivityService{
public abstract Foo processEntity(Entity entity);
}
问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,而不是服务,并且我无法对其进行任何硬编码)
您应该尝试避免这种情况。 通常,您应该只将实体发送给知道如何处理实体的服务,而不要发送给一堆负责的服务。 但是我要做的是使用调度程序服务,该服务保留服务负责的类的映射。 它使用如下逻辑:
private Map<Class<? extends Entity>,
Class<? extends ActivityService>> serviceMap =
new ConcurrentHashMap<Class<? extends Entity>,
Class<? extends ActivityService>>();
private ApplicationContext context;
private ActivityService getServiceForEntity(Entity e){
Class<? extends Entity> entityClass = e.getClass();
Class<? extends ActivityService> serviceClass =
serviceMap.get(entityClass);
if(serviceClass==null){
for(Map.Entry<Class<? extends Entity>,
Class<? extends ActivityService>> entry :
serviceMap.entrySet()){
if(entry.getKey().isAssignableFrom(entityClass)){
serviceClass = entry.getValue();
break;
}
}
if(serviceClass==null){
// throw a suitable exception
}
serviceMap.put(entityClass, serviceClass);
}
return context.getBean(serviceClass);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.