0

基本クラス「アクティビティ」から継承するさまざまなエンティティ クラス (ActivityA、ActivityB、ActivityC ...) がある、Spring フレームワークを使用して設計された Web サービス アプリケーションに取り組んでいます。

これで、基本クラスとすべての子クラスのサービス レイヤーにさまざまなサービス API を記述しました。(名前を付けるには、ActivityService、ActivityAService、ActivityBService、ActivityCService ..)

各アクティビティで同様に動作するすべてのメソッドは、基本クラス (ActivityService) のサービス API に配置され、それぞれのサービスに残ります。

私は通常、自分が作業しているオブジェクトを知っており、それぞれのサービス API を呼び出します。しかし、特定のケースでは、アクティビティ オブジェクトがあり (どの子クラスかがわからない)、すべてのエンティティ オブジェクトに対して異なるメソッドを作成する必要があります。

問題: 方法はありますか?私が持っているエンティティ オブジェクトに基づいて異なるサービスを呼び出すことができます (私が持っているオブジェクトはサービスではなくエンティティであり、サービス オブジェクトを取得するためにハード コーディングを行うことはできません)

4

1 に答える 1

1

しかし、特定のケースでは、アクティビティ オブジェクトがあり (どの子クラスかがわからない)、すべてのエンティティ オブジェクトに対して異なるメソッドを作成する必要があります。

基本クラスを抽象化し、各サブクラスが実装する必要がある抽象メソッドを定義するだけです。

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

問題:方法はありますか、私が持っているエンティティオブジェクトに基づいて異なるサービスを呼び出すことができます.

これは避けるべき状況です。通常、エンティティは、エンティティを処理するサービスにのみ送信する必要があり、そのうちの 1 つが担当している一連のサービスには送信しないでください。しかし、私がしたいことは、サービスが担当するクラスのマップを保持するディスパッチャ サービスを使用することです。次のようなロジックを使用します。

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);
}
于 2010-12-09T08:06:14.930 に答える