9

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

他的示例项目只有一个域对象一个用户。使用 POJO 一切都很清楚。我遇到的问题是,假设用户有书。一对多的关系。你会如何在 Clean Architecture 中处理这个问题?

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

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

对我来说,问题出在 UI/Presenter 级别。在程序的这一点上,我有一个 UserModel 对象和一个 BookModels 列表。我没有 userModel.getBooks()。我没有 userModel.save() (这也将保存所有书籍更改)。

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

我该怎么办?

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

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

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

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

-麦克风

4

1 回答 1

2

这就是Bob 大叔的简洁架构。Fernando Cejas 在 Android 中做了一个简化的示例,但您应该阅读原文中的概念。

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

您可以仅使用用户参考来保存一本书吗?拥有一个标识图书所有者的属性,或者通过参数将其传递给仅为图书的 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,这会将每个项目解析到正确的存储库(在这种情况下,您将注入 2 个存储库)。

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

于 2015-08-25T17:53:21.763 回答