我正在使用spring框架设计的Web服务应用程序,其中我有不同的实体类(ActivityA,ActivityB,ActivityC ...),它们继承自基类“activity”
现在我已经在基类和所有子类的服务层中编写了不同的服务API。 (名称,ActivityService,ActivityAService,ActivityBService,ActivityCService ..)
所有为每个活动操作类似的方法都放在基类(ActivityService)的服务api中,并在各自的服务中休息。
我通常知道我正在处理哪个对象,并且我将相应的服务api称为。但在特定情况下,我有活动对象(不知道它是哪个子类),并且必须编写一个对所有实体对象都不同的方法。
问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,而不是服务,我不能做任何硬编码来获取服务对象)
答案 0 :(得分:1)
但在特定情况下,我有活动对象(不知道它是哪个子类),必须编写一个对所有实体对象都不同的方法。
只需使基类抽象化并定义每个子类必须实现的抽象方法:
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);
}