你如何在 Clean Architecture 中实现一对多的关系

Mik*_*Dev 9 java android system-design

我在使用 Clean Architecture 时遇到问题。对于那些阅读过 Fernando Cejas 的博客文章 http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/ 的人,我的问题是基于它和他的代码。

他的示例项目只有一个域对象一个用户。POJO 的一切都一目了然。我遇到问题的地方是,假设用户有书。一对多的关系。您将如何在 Clean Architecture 中处理这个问题?

就像他一样,我有几个层,所以每个域对象(用户、用户模型、用户实体)有 3 个类,每个域对象(UserDataRepository)有一个存储库。我们的新示例还将包含 Book、BookModel、BookEntity 和 BookDataRepository。

我还有带有 CRUD 变体的用例类。

我的问题出在 UI/Presenter 级别。此时在程序中,我有一个 UserModel 对象和一个 BookModel 列表。我没有 userModel.getBooks()。我没有 userModel.save() (它也可以保存所有书籍更改)。

为了突出这个问题,为了让这个类比看起来更像我的实际用例,我还有书中所有页面的列表!:) 因此,当我保存用户时,我想保存到书籍中,以及可能已修改的每本书的所有页面。

我该怎么办?

第二个奖励问题:在我的现实问题中,我有从基类派生的类。使用上面的类比:LeftPage 和 RightPage 将派生自 PageBase。一本书有一个列表。但是 LeftPage 和 RightPage 都有各自的存储库、单独的用例等(但这不起作用)如何保存列表?我是否必须制作一个单独的用例 SavePages ,它会有一个:

if (pages.elementAt(i) instanceof LeftPage) { SaveLeftPage saveLeft = new ..... } else { SaveRightPage saveRight = new ..... }

我不认为我可以使用多态,因为在我看到的所有文档中,模型不知道用例。

我希望你能帮助,非常感谢你的时间:)

-麦克风

Jai*_*des 2

这就是鲍勃叔叔的干净架构。Fernando Cejas 在 Android 中做了一个简化的示例,但您应该阅读原始版本中的概念。

对于您的问题,您的用例实际上是什么?用书籍和页面拯救用户?如果用例有要求,您可以这样做。您的实体 User 可以拥有一系列书籍,而每本书又将拥有一系列页面,并且您的 UserRepository 必须能够将每个书籍解析为自己的表(或者您可以将存储库注入到您自己的存储库中,但在这种情况下,您必须可以全部保存或回滚)

您可以仅保存用户参考的书籍吗?拥有一个属性来标识该书的所有者,或者通过参数将其传递给该书的用例。

      public class SaveBookCase extends UseCase
      {
          public SaveBookCase(IBookRepository repository, Book book, int userId) 
          {
          /// 
          }

          //or

          public SaveBookCase(IBookRepository repository, SaveBookRequest request)
          {
          /// SaveBookRequest is a class that has the book and the user id
          }
      }
Run Code Online (Sandbox Code Playgroud)

关于第二个额外问题,如果您只有 PageBase 列表,则必须将其传递给用例 SavePages,这会将每个项目解析到正确的存储库(在这种情况下,您将注入 2 个存储库)。

但在您的示例中,它可以是同一个数据库实体,并带有一个字段来标识其左侧还是右侧,并且在这种情况下,仅使用一个存储库。

  • 不,我正在尝试了解重建此树结构的正确方法。所有文档/示例都适用于简单的 POJO。我明白这一点。但没有任何内容显示如何使用父对象->子对象。利用文档中的知识,我将拥有一个 User 对象和*旁边*的另一个 list<book> 类型的对象。我不知道如何正确构建具有 list<book> 子级的 User 对象。 (2认同)