问题标签 [clean-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
22457 浏览

architecture - 清洁架构与洋葱架构

我一直在阅读洋葱架构,今天我发现了鲍勃叔叔的清洁架构

对于我的生活,我看不出它们之间有任何区别,它们看起来相同(命名约定除外)。

两种建筑风格有什么区别吗?如果是的话,你能给我解释一下吗?

干杯

0 投票
3 回答
1061 浏览

go - “清洁架构”Go 程序的通用 ID 类型

我试图在使用 Bob Martin 叔叔的“清洁架构”设计的 Go 程序中为我的 ID 找到合适的类型。

我正在关注 Bob Martin 叔叔的“清洁架构”,其中代码被组织为一组层(从外到内:基础设施接口用例)。原则之一是依赖规则:源代码依赖只能指向内部

我的User类型是域层的一部分,因此ID类型不能依赖于为UserRepository;选择的数据库。如果我使用 MongoDB,ID 可能是ObjectId( string),而在 PostgreSQL 中,我可能使用整数。领域层中的User类型无法知道实现类型将是什么。

通过依赖注入,一个真正的类型(例如MongoUserRepository)将实现UserRepository接口并提供FindByID方法。由于这MongoUserRepository将在接口或基础设施层中定义,因此它可以取决于UserRepository(更向内的)领域层中的定义。

我考虑过使用

但是,如果外层之一中的代码尝试分配不正确的实现类型,则编译器将不会很有帮助。

我想让指定数据库的接口层或基础设施层确定并要求特定类型UserID,但我不能让域层代码导入该信息,因为这将违反依赖规则。

我也考虑过(目前正在使用)

但这假设知道数据库将使用字符串作为其 ID(我正在使用 MongoDB 及其ObjectId-- 的类型同义词string)。

如何以惯用的方式处理此问题,同时允许编译器提供最大的类型安全性并且不违反依赖规则?

0 投票
1 回答
380 浏览

android - Dagger 在单独的 gradle 模块中

我的“干净架构”Android 应用程序中有 3 个 gradle 模块:“数据”、“域”和“演示”。'data' 和 'presentation' 都依赖于 'domain',但不相互依赖。'presentation' 保存应用程序类的实现,而 'data' 保存一些存储库单例的实现。

我想使用 Dagger 2 在应用程序中实例化存储库,但在这种情况下,我需要在“数据”和“演示”之间建立间接的 gradle 依赖关系。从 Clean 架构的角度来看,这种依赖关系看起来很丑陋,这使得从“表示”访问“数据”成为可能。将 Dagger 组件和模块代码放在单独的 gradle 模块 'di' 中会创建循环 gradle 依赖项 'data' -> 'di' -> 'data'。

是否有适当的方法将所有 DI 代码移动到单独的模块中?

0 投票
1 回答
342 浏览

ios - 清洁架构:服务器上的交互器逻辑

我一直在玩Clean ArchitectureVIPER

昨天有朋友问我为什么不把Interactor逻辑放在服务器上,把处理后的数据同步到iOS客户端,而不是发送原始数据在Interactor. 这将有很多好处,因为能够随意更改逻辑,在多个客户端(例如 iOS 和 Android)上复制的代码更少等。

例如,假设我们有一个Profiles 列表和一个Posts 列表。每个帖子都有一个图像和一个 profileID。

假设我们想要一个显示所有帖子图像的表格视图的屏幕,当用户点击帖子时,我们在单独的屏幕上显示相应的配置文件。在配置文件中,我们将显示该配置文件发布的名称和所有图像。

如果我们将逻辑留在客户端,我们将像这样同步数据:

然后我们将有一个ShowPostsInteractor只返回所有帖子的数据和一个ShowProfileInteractor,它将过滤帖子的数据以仅从该配置文件中获取帖子,然后它将一些数据返回到视图,例如:

第二种选择是将此逻辑保留在服务器上,在这种情况下,同步数据将是:

(注意添加imageURLsin profiles

并且ShowProfileInteractor只会将配置文件数据按原样传递给视图,因为它不再需要过滤帖子(这是由服务器完成的)。

当然,第二种方法复制了一些数据,但由于它只是字符串,所以这不是很相关。

我经常看到第一种方法。所以我的问题是,为什么我不采用第二种方法(在服务器上保留尽可能多的逻辑),并且可能从客户端删除所有交互器,让控制器直接访问网关,因为不会处理数据?

0 投票
1 回答
162 浏览

domain-driven-design - 对应用结构和通信方向的质疑

我目前正在构建一个 CQS 风格的 DDD 应用程序。我对所有“组件”如何相互工作有一些疑问。

但首先我将简要概述一下应用程序的结构:


我的问题:

  1. a 与aDomainEventHandler对应并在 aRepository上调​​用某些方法可以Aggregate吗?或者它应该总是对应于一个ApplicationService
  2. QueryService返回 'Representation​​ ' 对象。这些由 UI AND by'Open Host' Facade作为返回值使用。可以将这些对象重用为返回值Facade吗?还是应该Facade自己创建Objects,连结果都基本一样?
  3. ApplicationService将 ' Commands' 作为输入参数。可以吗?这些Commands也被使用Open Host Facade?还是应该Facade只接受原始值并Commands在委托给时将它们转换为ApplicationService
  4. DomainEventHandlers似乎驻留在“ Infrastructure”层。是否有可能 aApplicationServiceDomain Service也订阅了 a Domain Event?或者这总是一种Infrastructure责任?

非常欢迎所有建议!

0 投票
0 回答
1962 浏览

android - 当应用程序在后台时,如何为 Firebase 通知设置声音?

我正在开发一个使用 Firebase 云消息传递的应用程序。我正在使用干净的架构。我的 FirebaseMessaging 类在我的数据层中。该类如下所示:

如您所见,我的函数 sendNotification 用于在消息到达我的设备时构建通知。而且我必须通过层将这个功能推送到表示层,然后执行所有用于发出通知的逻辑。但我不知道该怎么做,因为函数 sendNotification hase 参数是远程消息,我无法通过域层推送远程消息,因为域层不支持 google-play 服务。有人知道如何将此功能 sendNotification 推送到演示层吗?

0 投票
1 回答
1911 浏览

java - 清洁架构和缓存失效

我有一个尝试遵循清洁架构的应用程序,我需要做一些缓存失效,但我不知道应该在哪一层完成。

为了这个例子,假设我有OrderInteractor2 个用例:getOrderHistory()sendOrder(Order).

第一个用例使用 an OrderHistoryRepository,第二个用例使用OrderSenderRepository. 这些存储库是具有多种实现的接口(MockOrderHistoryRepository以及InternetOrderHistoryRepository第一个实现)。唯一通过接口与这些OrderInteractor存储库交互以隐藏真正的实现。

Mock版本非常虚拟,但Internet历史存储库的版本将一些数据保留在缓存中以更好地执行。

现在,我想实现以下内容:成功发送订单时,我想使历史缓存无效,但我不知道应该在哪里执行实际的缓存无效。

我的第一个猜测是在交互器内部的方法末尾添加一个invalidateCache()并使用OrderHistoryRepository此方法。sendOrder()在 中InternetOrderHistoryRepository,我只需要实现缓存失效,我会很好。但是我将被迫在内部实际实现该方法,MockOrderHistoryRepository并且它向外部暴露了一些缓存管理是由存储库执行的事实。我认为OrderInteractor不应该知道这个缓存管理,因为它InternetOrderHistoryRepository.

我的第二个猜测是InternetOrderSenderRepository当它知道订单已成功发送时执行缓存失效,但它将强制此存储库知道InternetOrderHistoryRepository,以便获取此存储库用于缓存管理的缓存密钥。而且我不希望我OrderSenderRepositoryOrderHistoryRepository.

最后,我的第三个猜测是有某种CacheInvalidator(无论名称如何)接口,在模拟存储库时使用一个实现,在使用存储库时使用Dummy一个Real实现。这将被注入到,并且选定的实现将由正在构建存储库和. 这意味着我将有一个- 正在构建和- 并且- 正在构建和。但是在这里,我不知道这应该由末尾使用还是直接由InteractorInternetCacheInvalidatorInteractorFactoryCacheInvalidatorMockedOrderHistoryRepositoryFactoryMockedOrderHistoryRepositoryDummyCacheInvalidatorInternetOrderHistoryRepositoryFactoryInternetOrderHistoryRepositoryRealCacheInvalidatorCacheInvalidatorInteractorsendOrder()InternetOrderSenderRepository(尽管我认为后者更好,因为交互者可能不应该知道引擎盖下有一些缓存管理)。

您首选的架构方式是什么?

非常感谢。皮埃尔

0 投票
1 回答
198 浏览

android - 使用事件总线解耦 Android 应用程序

我可以使用事件总线来解耦所有的应用程序层吗?我正在尝试使用干净的架构。通常解耦是由边界接口完成的,我已经看到了一些使用 RX 观察者的例子。问题是我可以使用事件总线来解耦层吗?事件总线可以处理这样的工作吗?

0 投票
0 回答
160 浏览

java - Android Clean Architecture双重实现

我正在学习 Android clean 架构,我以此为例https://github.com/dmilicic/Android-Clean-Boilerplate

我已经创建了一些代码的类图以更好地理解它,然后这让我很受打击。如果我使用作者对如何使用架构的描述,Interactor 接口是“双重”实现的。他说每个创建的交互器都应该扩展 AbstractInteractor,并且还应该实现一个单独的接口(在本例中是 WelcomingInteractor,它也扩展了 Interactor 接口。

这只是作者方面的一个错误。还是有充分的理由这样做?

最好的问候莫滕

在此处输入图像描述

0 投票
1 回答
4989 浏览

android - 清洁架构与 MVPC/MVC/MVP

我正在研究Uncle Bob Clean Architecture,并试图在我的 IOS/Android 项目中使用女巫设计模式的许多不同方面进行比较。

好的,我注意到 clean arch 非常强大和鲁棒,但同时,在我看来,我应该创建的类和文件的数量是否太多了。

所以我的问题是,这种设计模式是否比使用 MVC/MVP/MVPC 更有利?是不是开销太大了??哪种架构最适合 IOS/Android 项目?

我还没有找到任何充分的理由来证明我从其他设计模式更改为 Clean arch 是合理的,除了 UI 与主代码完全隔离这一事实。