2010-12-09 4 views
0

스프링 프레임 워크를 사용하여 설계된 웹 서비스 응용 프로그램에서 작업하고 있는데 여기에는 기본 클래스에서 상속받은 다른 엔티티 클래스 (ActivityA, ActivityB, ActivityC ...)가 있습니다. "activity"스프링 프레임 워크의 엔티티 객체를 기반으로 다른 서비스 API 호출

이제 기본 클래스 및 모든 하위 클래스에 대해 서비스 레이어에 다른 서비스 API를 작성했습니다. (ActivityService, ActivityService, ActivityBService, ActivityCService ..)

각각의 활동에 대해 비슷하게 작동하는 모든 메소드는 기본 클래스 (ActivityService)의 서비스 API에 놓이고 각각의 서비스에 있습니다.

내가 일반적으로 어떤 작업을하고 있는지 알고 있으며 각 서비스 API를 호출합니다. 그러나 특별한 경우에는 activity 객체 (어떤 자식 클래스인지 모름)가 있고 모든 엔티티 객체에 대해 다른 메서드를 작성해야합니다.

문제 :. 방법이 있나요, 나는 (수리하지, 내가 가진 개체가 개체의 내가 서비스 객체를 얻기 위해 하드 코딩을하지 못할) 내가 가지고있는 엔티티 객체에 따라 다른 서비스의를 호출 할 수 있습니다

답변

1

그러나 특별한 경우에 나는 activity 객체 (어떤 자식 클래스인지 모름)를 가지고 있으며 모든 엔티티 객체에 대해 다른 메소드를 작성해야한다.

그냥 기본 클래스 개요를 확인하고 각각의 서브 클래스를 구현하는 추상 메소드 정의 :

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. 나는 서비스 개체가 아니라 엔티티 개체 만 가지고 있다고 말했기 때문에 메서드를 재정의 할 수 없습니다. 음, 주어진 객체의 상응하는 서비스 클래스를 얻기 위해 위에 주어진 해결책은 어쩌면 끝내야 할 것인가 ..하지만 Spring이 해당 서비스로 엔티티를 연관시킬 수있는 몇 가지 방법이 있기를 바랬다 ...! ! – shailesh

+0

@shail * 내가 말했듯이 나는 서비스 객체가 아니라 엔티티 객체 만 가진다. * 오, 나는 다른 방향이라고 생각했다. 아니요, Spring은 애플리케이션의 아키텍처를 모르기 때문에 그렇게 할 수 없습니다. 각 개체가 올바른 서비스로 전달되는지 확인하기 위해 앱을 만들 때는 자신의 직업입니다. 대개 엔티티 유형마다 하나의 컨트롤러가 있고 올바른 서비스가 주입됩니다. –

+0

@ S.P. : ya,하지만 .. 나는 조금 복잡한 상황에 처해있다. 설명해 드리겠습니다. – shailesh