0

私の要件: プロジェクトの永続性を処理するサービスがあります。このサービスをPersistenceProviderサービスと呼び、「my.persistenceservice」バンドルに存在すると仮定します。

これで、MyPersistenseConsumerという名前のクラスの1つのbind()unbind()メソッドを使用してPersistenceProviderサービスを参照する「my.persitenceconsumer」バンドルという名前の別のバンドルができました。したがって、「my.persistenceconsumer」バンドルが開始すると、bind()メソッドを使用してPersistenceProviderサービスの参照を取得し、MyPersistenceConsumerはPersistenceProviderサービスを使用できます。

ただし、「my.persitenceconsumer」バンドルのさまざまなクラスのこのPersistenceProviderサービスも使用する必要があります。

私の質問は次のとおりです。 異なるクラス(同じバンドル内)内でそのような共有サービスを使用するための最良の方法は何ですか?

解決策の1つ: 静的getInstance()メソッドを持つ「my.persitenceconsumer」バンドルにActivatorクラスを追加できます。これはMyPersistenceConsumer.bind()によって呼び出すことができ、ActivatorとともにPersistenceProviderを格納します。「my.persitenceconsumer」バンドル内のすべてのクラスは、Activatorクラスを使用してPersistenceProviderを使用できます。

コードは次のとおりです。

public class MyPersistenceConsumer {
  public void bindPersistenceProvider(PersistenceProvider ppRef) {
    MyPersistenceConsumerActivator.getInstance().bindPersistenceProvider(ppRef);
  }
}

public class MyPersistenceConsumerActivator {
  static MyPersistenceConsumerActivator instance;
  PersistenceProvider ppRef;

  public static getInstance() {
    return instance;
  }

  public void bindPersistenceProvider(PersistenceProvider ppRef) {
    this.ppRef = ppRef;
  }
  public PersistenceProvider getPersistenceProvider() {
    return ppRef;
  }

  public void start(BundleContext context) throws Exception {
        instance = this;
  }
}

public class MyClass1 {

  public void usePersistenceProvider(){
    PersistenceProvider pp Ref =
      MyPersistenceConsumerActivator.getInstance().getPersistenceProvider();
  }

}

public class MyClass2 {

  public void usePersistenceProvider(){
    PersistenceProvider pp Ref =
      MyPersistenceConsumerActivator.getInstance().getPersistenceProvider();
  }

}

最後に: 上記は良い方法ですか..またはより良い方法はありますか?

4

2 に答える 2

2

シングルトンは、DSが排除しようとする悪です。シングルトンは脆弱なシステムを作成し、グローバル変数と同じ問題を抱えています。

最善の解決策は、カップリングなしです。DSで私は使用します:

@Component
public class MyClass1 {
  @Reference
  void setPP( PersistenceProvider pp ) { ... }
}

MyClass2についても同じです。クラス間にインスタンス関係がある場合は、すでに結合されているため、オブジェクトを渡します。いつものように、結合を最小にし、凝集を最大にします。

工場とシングルトンは、OSGiが非常に正当な理由で防ごうとしているまさに悪です。

于 2012-10-26T09:34:41.083 に答える
2

私がお勧めする2つの可能性があります:

  • 永続性サービス宣言型サービスを使用するオブジェクトを作成します。このSCRはすべてのライフサイクル管理を処理し、非常にモジュール化されたテスト可能なクラスを取得します。
  • または、これらのオブジェクトのコンストラクターでpersistence-serviceへの参照を渡すこともできます。ここでの唯一の問題は、永続化サービスがなくなった後、これらのオブジェクトが永続化サービスにアクセスしようとしないようにする必要があることです。

これらのアプローチのいずれかは、提案したシングルトンベースのソリューションよりも優先されます。

于 2012-10-25T15:42:35.303 に答える