首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无传递依赖的适配器和模块化

无传递依赖的适配器和模块化
EN

Stack Overflow用户
提问于 2015-09-18 09:29:17
回答 1查看 39关注 0票数 0

我遇到了以下几次情况,我无法找到一个完全令人满意的解决方案:

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

代码语言:javascript
复制
- 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方法,如下所示..。

代码语言:javascript
复制
UpdatedLinks replaceLinks(BusinessObjectUID from, Set<BusinessObjectUID> to);

...which应该确保在返回时,from业务对象只会链接到to对象,可能会删除以前的链接并添加新的链接。我想知道这些删除和补充的情况。我在插件UpdatedLinks中创建了一个接口com.example.core.business.objectmanager

代码语言:javascript
复制
public interface UpdatedLinks {
    Set<BusinessObjectUID> getRemovedLinks();
    Set<BusinessObjectUID> getAddedLinks();
}

但是BusinessObjectManager并不是真正要执行这个链接替换并将UpdatedLinks返回对象放在一起的那个人。相反,它将此委托给DatabaseManager。因此,我在DatabaseManager中创建了一个等价的方法,而BusinessObjectManager将简单地调用这个方法。

现在的问题是如何放置接口UpdatedLinksDatabaseManagerBusinessObjectManagerSomeBusinessObjectManagerConsumer都需要它,但是这些类(及其相应的插件)之间的依赖关系是朝着这个方向发展的:

代码语言:javascript
复制
SomeBusinessObjectManagerConsumer ---depends-on---> BusinessObjectManager ---depends-on---> DatabaseManager

所以:

  • 我不能将UpdatedLinks放在BusinessObjectManager的插件中,因为它对DatabaseManager是不可见的。
  • 我不能将它放在DatabaseManager的插件中,因为它对SomeBusinessObjectManagerConsumer来说是不可见的(请记住,SomeBusinessObjectManagerConsumerDatabaseManager一无所知;由于OSGi的模块化,它只能在声明一个明确的依赖项(我不想这样做)时才能访问DatabaseManager )。
  • 它太具体了,不能放在某种“实用程序”插件中。
  • 我目前没有任何插件,它是有意义的把这个接口,并将它提供给所有的依赖插件。

基本上,我必须为这个界面创建一个新的插件,考虑到谁将依赖它,我甚至无法为该插件找到任何有意义的名称。(但主要是,我反对只为这个接口创建插件的想法,它只是作为传递replaceLinks方法结果的一种手段)。

我已经多次遇到这种情况(特别是最近使用OSGi,因为模块化),而且我永远也找不到一个完全令人满意的解决方案。在这种情况下你会做什么?

"Meta“免责声明:

  • 标题可能会更好,我只是想不出一个更好的标题。随时可以改变它。
  • 我不确定堆栈溢出是否适合这个问题的StackExchange社区,所以请随意推荐更合适的其他社区。我找不到更好的了。
  • 我试着详细解释一下,这样你就可以想象出情况了。我希望我没有做得过火;)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 10:35:42

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32648567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档