2010-12-09 4 views
0

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

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

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

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

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

ответ

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); 
} 
+0

Спасибо S.P. Я не могу переопределить метод, так как я сказал, что у меня есть объект объекта, а не объект службы. Ну, решение, данное выше, чтобы получить соответствующий класс обслуживания данного объекта, - это то, что можно сделать, возможно .. но я надеялся (m new to spring), что Spring мог бы связать сущности с их соответствующей службой ...! ! – shailesh 2010-12-09 08:36:19