java - 您如何在 Clean Architecture 中实现一对多关系

标签 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 对象和一个 BookModels 列表。我没有 userModel.getBooks()。我没有 userModel.save()(它也会保存所有书籍更改)。

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

我该怎么做?

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

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

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

我希望你能帮上忙,非常感谢你抽出时间:)

-麦克

最佳答案

那是 Uncle Bob's Clean Architecture . Fernando Cejas 在 Android 中做了一个简化的例子,但你应该阅读原文中的概念。

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

你能保存一本只有用户引用的书吗?拥有标识图书所有者的属性,或通过参数将其传递给图书的 UseCase。

      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
          }
      }

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

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

关于java - 您如何在 Clean Architecture 中实现一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32210197/

相关文章:

object-oriented-analysis - 学习解决系统设计面试问题的资源

java - 正确的交互式网站系统设计理念/方法?

android - ListView 在 AndroidSlidingUpPanel 中不滚动

UML如何指示一个类向同一类发送请求

java - catch 方法执行时间较长

java - 以下 "private static inner class"实现正确吗?

java - 您能否在用户更新到 Google Play 商店中您的应用程序的最新版本之前向他们发出警告?

android - 有什么方法可以检测视频是否可以在设备上播放?

java - 将 EditText 存储在数组中并显示在 TextView 中

Java新手: JPA and EJB workflow question