我在使用Clean Architecture时遇到问题。对于那些已经读过费尔南多·塞哈斯(Fernando Cejas)博客文章的人
http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/,我的问题是基于它和他的代码。

他的示例项目只有一个用户一个域对象。 POJO可以使一切变得清晰。我遇到问题的地方是,假设用户有书籍。一对多的关系。您将如何在Clean Architecture中处理此问题?

就像他一样,我有几层,所以每个域对象(User,UserModel,UserEntity)有3个类,每个域对象(UserDataRepository)有一个存储库。
我们的新示例还将具有Book,BookModel,BookEntity和BookDataRepository。

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

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

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

我将如何处理?

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

如果(LeftPage的pages.elementAt(i)实例){
SaveLeftPage saveLeft =新.....
}
别的 {
SaveRightPage saveRight =新.....
}

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

希望您能提供帮助,非常感谢您的宝贵时间:)

-麦克风

最佳答案

那是Uncle Bob's Clean Architecture。 Fernando Cejas在Android中做了一个简化的示例,但是您应该阅读原始内容中的概念。

对于您的问题,实际上您的用例是什么?用书籍和页面保存用户?如果用例有要求,则可以执行此操作。您的实体用户可以有一个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,用例SavePages会将每个项目解析为正确的存储库(在这种情况下,您将注入(inject)2个存储库)。

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

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

10-11 17:11