没有过渡依赖的适配器和模块化

阿力克斯

我几次遇到以下情况,但找不到完全令人满意的解决方案:

我正在使用OSGi开发Java应用程序,并且按照OSGi的最佳实践,它是高度模块化的。以下是其中一些插件和类的摘录:

- com.example.core.db.manager (plugin)
    |- com.example.core.db.manager (package)
         |- DatabaseManager (interface)

- com.example.core.business.objectmanager (plugin)
    |- com.example.core.business.objectmanager (package)
         |- BusinessObjectManager (interface)

- com.example.some.businessobjectmanager.consumer (plugin)
    |- com.example.some.businessobjectmanager.consumer (package)
         |- SomeBusinessObjectManagerConsumer (interface)
            (obviously this is not the real name, but the name is irrelevant)

在哪里

  • DatabaseManager 是直接与数据库交互的低级构造。
  • BusinessObjectManager是一个高级构造,它(除其他外)充当的适配器DatabaseManager
  • SomeBusinessObjectManagerConsumer消耗BusinessObjectManager,不应该了解底层数据库,即使不存在一个数据库。它应该知道的DatabaseManager; 相反,它应仅与进行交互BusinessObjectManager

到目前为止,一切都很好。但是现在SomeBusinessObjectManagerConsumer需要更新数据库中实体之间的一些边缘(我使用图形数据库,这意味着我的实体(通常是表中的行)是节点,它们之间的关系是边缘)。如前所述SomeBusinessObjectManagerConsumer,对数据库一无所知,但它知道有一些“业务对象”(节点),并且它们之间有链接(边缘)。

在中BusinessObjectManager,我创建了一个replaceLinks如下的方法...

UpdatedLinks replaceLinks(BusinessObjectUID from, Set<BusinessObjectUID> to);

...这应该确保在返回时,from业务对象将仅链接到to对象,可能会删除先前的链接并添加新的链接。我想了解有关这些删除和添加的信息。UpdatedLinks在plugin中创建一个接口com.example.core.business.objectmanager

public interface UpdatedLinks {
    Set<BusinessObjectUID> getRemovedLinks();
    Set<BusinessObjectUID> getAddedLinks();
}

但是,BusinessObjectManager实际上不是要执行此链接替换并将UpdatedLinks返回对象放在一起的那个而是将其委托给DatabaseManager因此,我在中创建了一个等效方法DatabaseManagerBusinessObjectManager并将简单地调用此方法。

现在的问题是在哪里放置接口UpdatedLinks:它是由需要DatabaseManagerBusinessObjectManagerSomeBusinessObjectManagerConsumer,但(及其相应的插件)这些类之间的依赖关系转到这个方向:

SomeBusinessObjectManagerConsumer ---depends-on---> BusinessObjectManager ---depends-on---> DatabaseManager

所以:

  • 我不能把UpdatedLinksBusinessObjectManager的插件,因为那是不可见的DatabaseManager
  • 我不能将其放在DatabaseManager的插件中,因为那对于它是不可见的SomeBusinessObjectManagerConsumer(请记住,SomeBusinessObjectManagerConsumer它一无所知DatabaseManager;由于OSGi中的模块化,因此只有DatabaseManager在我声明对它的显式依赖的情况下,它才可以访问,但我对此不知道。)不想做)。
  • 将其放入某种“实用程序”插件中太具体了。
  • 我目前没有任何可以放置此接口的插件,这将使它可用于所有从属插件。

基本上,我只需要为此接口创建一个新插件,考虑到谁将依赖它,我什至找不到该插件的任何有意义的名称。(但主要是,我拒绝为该接口创建插件的想法,该插件仅作为传递replaceLinks方法结果的一种方法而存在)。

我已经多次遇到这种情况(尤其是由于模块化,最近使用OSGi),我再也找不到一个完全令人满意的解决方案。在这种情况下您会/会做什么?


“元”免责声明:

  • 标题可能会更好;我只是无法提出更好的选择。随时更改它。
  • 我不确定stackoverflow是否适合该问题的StackExchange社区,所以请随时推荐其他可能更合适的对象。我找不到更好的了。
  • 我试图详细解释,以便您可以了解情况。我希望我没有过分;)
克里斯汀·施耐德(Christian Schneider)

我建议为此简单地创建两个接口。一种是由BusinessObjectManager使用的DataBaseManager级别,另一种是SomeBusinessObjectManagerConsumer使用的BusinessObjectManager级别。

由于您不希望连接底层和顶层,因此也不应在它们之间共享接口。当然,您也可以为此创建一个特殊的api捆绑包,但我认为这样做不值得,并且会损害每一层api的内聚性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章