Вызовите различные API-интерфейсы сервисов на основе объекта-сущности в рамках Spring - PullRequest
0 голосов
/ 09 декабря 2010

Я работаю над приложением веб-службы, разработанным с использованием Spring Framework, где у меня есть различные классы сущностей (ActivityA, ActivityB, ActivityC ...), которые наследуются от базового класса "activity"

Теперь я написал разные API-интерфейсы сервисов на уровне сервисов для базового класса и всех дочерних классов. (чтобы назвать ActivityService, ActivityAService, ActivityBService, ActivityCService ..)

Все методы, которые работают аналогично для каждого действия, помещаются в API-интерфейсы базового класса (ActivityService) и располагаются в соответствующих службах.

Я обычно знаю, над каким объектом я работаю, и вызываю соответствующий сервисный API. Но в конкретном случае у меня есть объект активности (я не знаю, какой это дочерний класс) и мне нужно написать метод, который отличается для всех объектов сущности.

ПРОБЛЕМА: Есть ли способ, я могу вызывать разные сервисы в зависимости от имеющегося у меня объекта сущности (у меня есть объект, а не служба, и я не могу выполнить какое-либо жесткое кодирование для получения объекта Service)

1 Ответ

1 голос
/ 09 декабря 2010

Но в конкретном случае у меня есть объект действия (не знаю, какой это дочерний класс), и мне нужно написать метод, который отличается для всех объектов сущности.

Просто сделайте базовый класс абстрактным и определите абстрактный метод, который должен реализовывать каждый подкласс:

public abstract class ActivityService{
    public abstract Foo processEntity(Entity entity);
}

ПРОБЛЕМА: Есть ли способ, я могу вызывать разные службы на основе объекта сущности Iиметь. (у меня есть объект, а не служба, и я не могу выполнить для него жесткое кодирование)

Эту ситуацию вам следует избегать.Обычно вы должны отправлять объект только в службу, которая знает, что с ней делать, а не в группу служб, одна из которых отвечает.Но я бы использовал диспетчерскую службу, которая хранит карту классов, за которые отвечают службы.Он использует логику так:

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);
}
...