问题标签 [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.
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
)。
如何以惯用的方式处理此问题,同时允许编译器提供最大的类型安全性并且不违反依赖规则?
android - Dagger 在单独的 gradle 模块中
我的“干净架构”Android 应用程序中有 3 个 gradle 模块:“数据”、“域”和“演示”。'data' 和 'presentation' 都依赖于 'domain',但不相互依赖。'presentation' 保存应用程序类的实现,而 'data' 保存一些存储库单例的实现。
我想使用 Dagger 2 在应用程序中实例化存储库,但在这种情况下,我需要在“数据”和“演示”之间建立间接的 gradle 依赖关系。从 Clean 架构的角度来看,这种依赖关系看起来很丑陋,这使得从“表示”访问“数据”成为可能。将 Dagger 组件和模块代码放在单独的 gradle 模块 'di' 中会创建循环 gradle 依赖项 'data' -> 'di' -> 'data'。
是否有适当的方法将所有 DI 代码移动到单独的模块中?
ios - 清洁架构:服务器上的交互器逻辑
我一直在玩Clean Architecture和VIPER。
昨天有朋友问我为什么不把Interactor
逻辑放在服务器上,把处理后的数据同步到iOS客户端,而不是发送原始数据在Interactor
. 这将有很多好处,因为能够随意更改逻辑,在多个客户端(例如 iOS 和 Android)上复制的代码更少等。
例如,假设我们有一个Profile
s 列表和一个Post
s 列表。每个帖子都有一个图像和一个 profileID。
假设我们想要一个显示所有帖子图像的表格视图的屏幕,当用户点击帖子时,我们在单独的屏幕上显示相应的配置文件。在配置文件中,我们将显示该配置文件发布的名称和所有图像。
如果我们将逻辑留在客户端,我们将像这样同步数据:
然后我们将有一个ShowPostsInteractor
只返回所有帖子的数据和一个ShowProfileInteractor
,它将过滤帖子的数据以仅从该配置文件中获取帖子,然后它将一些数据返回到视图,例如:
第二种选择是将此逻辑保留在服务器上,在这种情况下,同步数据将是:
(注意添加imageURLs
in profiles
)
并且ShowProfileInteractor
只会将配置文件数据按原样传递给视图,因为它不再需要过滤帖子(这是由服务器完成的)。
当然,第二种方法复制了一些数据,但由于它只是字符串,所以这不是很相关。
我经常看到第一种方法。所以我的问题是,为什么我不采用第二种方法(在服务器上保留尽可能多的逻辑),并且可能从客户端删除所有交互器,让控制器直接访问网关,因为不会处理数据?
domain-driven-design - 对应用结构和通信方向的质疑
我目前正在构建一个 CQS 风格的 DDD 应用程序。我对所有“组件”如何相互工作有一些疑问。
但首先我将简要概述一下应用程序的结构:
我的问题:
- a 与a
DomainEventHandler
对应并在 aRepository
上调用某些方法可以Aggregate
吗?或者它应该总是对应于一个ApplicationService
? QueryService
返回 'Representation
' 对象。这些由 UI AND by'Open Host' Facade
作为返回值使用。可以将这些对象重用为返回值Facade
吗?还是应该Facade
自己创建Objects,连结果都基本一样?ApplicationService
将 'Commands
' 作为输入参数。可以吗?这些Commands
也被使用Open Host Facade
?还是应该Facade
只接受原始值并Commands
在委托给时将它们转换为ApplicationService
?DomainEventHandlers
似乎驻留在“Infrastructure
”层。是否有可能 aApplicationService
或Domain Service
也订阅了 aDomain Event
?或者这总是一种Infrastructure
责任?
非常欢迎所有建议!
android - 当应用程序在后台时,如何为 Firebase 通知设置声音?
我正在开发一个使用 Firebase 云消息传递的应用程序。我正在使用干净的架构。我的 FirebaseMessaging 类在我的数据层中。该类如下所示:
如您所见,我的函数 sendNotification 用于在消息到达我的设备时构建通知。而且我必须通过层将这个功能推送到表示层,然后执行所有用于发出通知的逻辑。但我不知道该怎么做,因为函数 sendNotification hase 参数是远程消息,我无法通过域层推送远程消息,因为域层不支持 google-play 服务。有人知道如何将此功能 sendNotification 推送到演示层吗?
java - 清洁架构和缓存失效
我有一个尝试遵循清洁架构的应用程序,我需要做一些缓存失效,但我不知道应该在哪一层完成。
为了这个例子,假设我有OrderInteractor
2 个用例:getOrderHistory()
和sendOrder(Order)
.
第一个用例使用 an OrderHistoryRepository
,第二个用例使用OrderSenderRepository
. 这些存储库是具有多种实现的接口(MockOrderHistoryRepository
以及InternetOrderHistoryRepository
第一个实现)。唯一通过接口与这些OrderInteractor
存储库交互以隐藏真正的实现。
该Mock
版本非常虚拟,但Internet
历史存储库的版本将一些数据保留在缓存中以更好地执行。
现在,我想实现以下内容:成功发送订单时,我想使历史缓存无效,但我不知道应该在哪里执行实际的缓存无效。
我的第一个猜测是在交互器内部的方法末尾添加一个invalidateCache()
并使用OrderHistoryRepository
此方法。sendOrder()
在 中InternetOrderHistoryRepository
,我只需要实现缓存失效,我会很好。但是我将被迫在内部实际实现该方法,MockOrderHistoryRepository
并且它向外部暴露了一些缓存管理是由存储库执行的事实。我认为OrderInteractor
不应该知道这个缓存管理,因为它Internet
是OrderHistoryRepository
.
我的第二个猜测是InternetOrderSenderRepository
当它知道订单已成功发送时执行缓存失效,但它将强制此存储库知道InternetOrderHistoryRepository
,以便获取此存储库用于缓存管理的缓存密钥。而且我不希望我OrderSenderRepository
对OrderHistoryRepository
.
最后,我的第三个猜测是有某种CacheInvalidator
(无论名称如何)接口,在模拟存储库时使用一个实现,在使用存储库时使用Dummy
一个Real
实现。这将被注入到,并且选定的实现将由正在构建存储库和. 这意味着我将有一个- 正在构建和- 并且- 正在构建和。但是在这里,我不知道这应该由末尾使用还是直接由Interactor
Internet
CacheInvalidator
Interactor
Factory
CacheInvalidator
MockedOrderHistoryRepositoryFactory
MockedOrderHistoryRepository
DummyCacheInvalidator
InternetOrderHistoryRepositoryFactory
InternetOrderHistoryRepository
RealCacheInvalidator
CacheInvalidator
Interactor
sendOrder()
InternetOrderSenderRepository
(尽管我认为后者更好,因为交互者可能不应该知道引擎盖下有一些缓存管理)。
您首选的架构方式是什么?
非常感谢。皮埃尔
android - 使用事件总线解耦 Android 应用程序
我可以使用事件总线来解耦所有的应用程序层吗?我正在尝试使用干净的架构。通常解耦是由边界接口完成的,我已经看到了一些使用 RX 观察者的例子。问题是我可以使用事件总线来解耦层吗?事件总线可以处理这样的工作吗?
java - Android Clean Architecture双重实现
我正在学习 Android clean 架构,我以此为例https://github.com/dmilicic/Android-Clean-Boilerplate
我已经创建了一些代码的类图以更好地理解它,然后这让我很受打击。如果我使用作者对如何使用架构的描述,Interactor 接口是“双重”实现的。他说每个创建的交互器都应该扩展 AbstractInteractor,并且还应该实现一个单独的接口(在本例中是 WelcomingInteractor,它也扩展了 Interactor 接口。
这只是作者方面的一个错误。还是有充分的理由这样做?
最好的问候莫滕
android - 清洁架构与 MVPC/MVC/MVP
我正在研究Uncle Bob Clean Architecture,并试图在我的 IOS/Android 项目中使用女巫设计模式的许多不同方面进行比较。
好的,我注意到 clean arch 非常强大和鲁棒,但同时,在我看来,我应该创建的类和文件的数量是否太多了。
所以我的问题是,这种设计模式是否比使用 MVC/MVP/MVPC 更有利?是不是开销太大了??哪种架构最适合 IOS/Android 项目?
我还没有找到任何充分的理由来证明我从其他设计模式更改为 Clean arch 是合理的,除了 UI 与主代码完全隔离这一事实。