iOS应用程序VIPER架构 - 有多少数据管理器?

时间:2015-12-10 21:00:46

标签: ios architecture viper-architecture

我正在VIPER Architectural pattern -

的背景下寻找这个问题的答案

如果您的应用程序与web apidatabase进行对话,您应该有一个,两个或三个dataManagers吗?

案例

a) dataManager

b) APIDataManagerLocalDataManager

c) dataManagerAPIDataManagerLocalDataManager

中的位置

a) interactor与单个dataManager对话,与您可能拥有的任何服务(远程或本地)进行对话。

b) interactor知道localremote信息之间的区别 - 并调用APIDataManager或{{1} },分别与远程和本地服务通信。

c) LocalDataManager只与普通interactor进行对话,将军dataManager会与dataManager和{{1}进行对话}

修改

可能没有明确的解决方案。但任何意见都会受到高度赞赏。

2 个答案:

答案 0 :(得分:5)

VIPER和The Clean Architecture都没有规定所有交互者都必须只有一个数据管理器。引用的VIPER文章仅使用一个管理器作为抽象特定存储实现的示例。

交互器对象实现特定于应用程序的业务规则。如果应用程序所做的是与服务器通信,然后转身并与本地磁盘存储器通信,那么交互者就知道这一点是完全正常的。更重要的是,一些交互者来管理这个。

不要忘记正常的对象组合规则也适用于交互者。例如,您从一个从服务器获取数据并将其保存到本地存储的交互器开始。如果它太大,你可以创建两个新的交互者,一个进行提取,另一个保存到本地商店。然后,您的原始交互器将包含这些新的交互器并将其所有工作委托给它们。如果遵循用于定义边界的规则,则在执行提取类重构时,您不必更改使用新复合交互器的对象。

另请注意,一般情况下,建议不要使用 manager controller 结尾命名对象,因为它们的角色不完全清楚。您可以将与服务器对话的接口命名为APIClient,即抽象本地存储的接口,例如EntityGatewayEntityRepository

答案 1 :(得分:4)

这取决于抽象在你的应用程序中的位置,这可以区分你做什么和你做什么。谁在定义有两种不同的数据存储?

如果本地和远程数据存储是问题域本身的一部分(例如,有时问题需要获取远程数据,有时需要获取本地数据),交互者知道两个不同的数据存储是明智的。

如果Interactor只关心请求的数据,但它不关心如何检索数据,那么单个数据管理器可以确定要使用哪个数据源。

这里有两个不同的角色 - 业务设计师和数据设计师。交互者负责满足业务设计者的需求,即业务逻辑,问题域等。数据层负责满足数据设计者的需求,即服务器团队,IT团队,数据库团队等。

谁有可能改变您要检索数据的位置,业务设计人员或数据设计人员?这个问题的答案将指导你到哪个班级负有这个责任。