2010-12-09 50 views
0

Je travaille sur une application de service web conçue en utilisant le framework spring, où j'ai différentes classes d'entités (ActivityA, ActivityB, ActivityC ...) qui héritent d'une classe de base "activité"Appeler différentes APIs de service basées sur l'objet entité dans le framework printanier

Maintenant, j'ai écrit différentes API de service dans la couche de service pour la classe de base et toutes les classes enfants. (à name, ActivityService, ActivityAService, ActivityBService, ActivityCService ..)

Toutes les méthodes qui fonctionnent de manière similaire pour chaque activité sont mises en service api de classe de base (ActivityService) et reposent dans leurs services respectifs.

Je connais généralement l'objet sur lequel je travaille, et j'appelle le service api respectif. Mais dans un cas particulier, j'ai l'objet d'activité (je ne sais pas de quelle classe enfant il s'agit) et je dois écrire une méthode qui est différente pour tous les objets d'entité.

PROBLÈME: Est-il possible, je peux appeler différent en fonction de l'objet de l'entité de service que j'ai (l'objet que j'ai est l'entité, et non le service et je ne peux pas faire tout codage en dur pour obtenir objet Service)

Répondre

1
.

Mais dans un cas particulier, j'ai l'objet d'activité (je ne sais pas de quelle classe enfant il s'agit) et je dois écrire une méthode qui est différente pour tous les objets d'entité.

Assurez la classe abstraite de base et définir une méthode abstraite que chaque classe sous doit mettre en œuvre:

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

PROBLÈME: Est-il possible, je peux appeler différent en fonction de l'entité de services objet que j'ai (l'objet que j'ai est d'entité, pas de service et je ne peux pas faire un codage dur à)

Ceci est une situation que vous devriez essayer d'éviter. Habituellement, vous devriez seulement envoyer une entité à un service qui sait quoi en faire, et non à un groupe de services, dont l'un est responsable. Mais ce que je ferais est d'utiliser un service de répartiteur qui conserve une carte des classes dont les services sont responsables. Il utilise une logique comme ceci:

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

Merci S.P. Je ne peux pas remplacer la méthode, parce que j'ai dit que je n'ai que l'objet entité, pas l'objet de service. Eh bien, la solution donnée ci-dessus pour obtenir la classe de service correspondante d'un objet donné est ce que l'on peut faire peut-être ... mais j'espérais (m new to spring) qu'il y aurait un moyen de relier les entités avec leur service correspondant ...! ! – shailesh

+0

@shail * comme je l'ai dit je n'ai que l'objet entité, pas l'objet de service * Oh, je pensais que c'était l'inverse. Non, Spring ne connaît pas l'architecture de votre application, elle ne peut donc pas le faire pour vous. C'est votre travail lorsque vous créez une application pour vous assurer que chaque entité est transmise au bon service. Habituellement, vous auriez un contrôleur par type d'entité, et le service correct serait injecté. –

+0

@ S.P. : ya, mais .. je suis dans une situation peu compliquée ici. Laissez-moi vous expliquer .. – shailesh