Domanda

Sto lavorando su un'applicazione di servizio web progettato utilizzando il framework di primavera, dove ho diverse classi di entità (ActivityA, ActivityB, ActivityC ...), che eredita da una classe base "attività"

Ora ho scritto diverse API Service 'nel livello di servizio per la classe base e di tutte le classi figlie. (A nome, ActivityService, ActivityAService, ActivityBService, ActivityCService ..)

Tutti i metodi che operano simile per ciascuna attività vengono messi in servizio api di classe base (ActivityService) e di riposo nei rispettivi servizi.

Io in genere sapere sempre quale oggetto sto lavorando su, e che io chiamo il rispettivo API Service. Ma in un caso particolare ho l'oggetto di attività (non so di quale classe bambino è) e devono scrivere un metodo che è diverso per tutti gli oggetti entità.

PROBLEMA: C'è un modo, posso chiamare il servizio diverso di base all'oggetto entità che ho (l'oggetto che ho è di entità, non è un servizio e non posso fare qualsiasi disco di codifica per ottenere l'oggetto di servizio)

.
È stato utile?

Soluzione

Ma in un caso particolare ho l'oggetto di attività (non so di quale classe bambino è) e devono scrivere un metodo che è diverso per tutti gli oggetti entità.

Basta fare la classe base astratta e definire un metodo astratto che ogni classe secondaria deve implementare:

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

PROBLEMA: C'è un modo, posso chiamare il servizio di diverso in base all'oggetto entità che ho (l'oggetto che ho è di entità, non è un servizio e non posso fare qualsiasi disco di codifica per a)

.

Questa è una situazione che si dovrebbe cercare di evitare. Di solito, è necessario inviare solo un soggetto a un servizio che sa cosa fare con esso, e non a un gruppo di servizi, uno dei quali è in carica. Ma quello che mi piacerebbe fare è utilizzare un servizio di dispatcher che mantiene una mappa di classi che i servizi sono incaricati di. Esso utilizza la logica in questo modo:

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top