0

我的要求: 我有一项服务可以处理我的项目的持久性。让我将此服务称为 PersistenceProvider 服务,并假设它位于“my.persistenceservice”包中。

现在,我有另一个名为“my.persitenceconsumer”的包,它使用名为 MyPersistenseConsumer 的类之一的 bind() unbind() 方法引用 PersistenceProvider 服务。因此,当“my.persistenceconsumer”捆绑启动时,它将使用 bind() 方法获取 PersistenceProvider 服务的引用,并且 MyPersistenceConsumer 可以使用 PersistenceProvider 服务

但是,我还需要从“my.persitenceconsumer”包中的不同类中使用这个 PersistenceProvider 服务。

我的问题是: 在不同的类中使用这种共享服务的最佳方式是什么(在同一个包中)

解决方案之一: 我可以在“my.persitenceconsumer”包中添加 Activator 类 .. 具有静态 getInstance() 方法。可以由 MyPersistenceConsumer.bind() 调用并将 PersistenceProvider 与 Activator 一起存储。后面“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

我推荐两种可能性:

  • 制作使用持久服务声明性服务的对象。这个 SCR 将处理所有生命周期管理,您将获得非常模块化和可测试的类。
  • 或者,您可以在这些对象的构造函数中传递对持久性服务的引用。这里唯一的问题是您必须确保这些对象在持久性服务消失后不会尝试访问它。

这些方法中的任何一种都优于您提出的基于单例的解决方案。

于 2012-10-25T15:42:35.303 回答