0

我正在开发一个使用 spring 框架设计的 Web 服务应用程序,其中我有不同的实体类(ActivityA、ActivityB、ActivityC ...),它们继承自基类“活动”

现在我已经为基类和所有子类在服务层编写了不同的服务 api。(命名,ActivityService,ActivityAService,ActivityBService,ActivityCService..)

对每个活动进行类似操作的所有方法都放在基类(ActivityService)的服务 api 中,并放在各自的服务中。

我通常知道我正在处理哪个对象,我调用了相应的服务 api。但在特定情况下,我有活动对象(不知道它是哪个子类)并且必须编写一个对所有实体对象都不同的方法。

问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,不是服务,我不能做任何硬编码来获取服务对象)

4

1 回答 1

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);
}
于 2010-12-09T08:06:14.930 回答