问题标签 [dependency-rule]

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 回答
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 投票
2 回答
3047 浏览

controller - 清洁架构中的控制器

我正在尝试在 Laravel 应用程序中应用 Bob 叔叔的Clean Architecture

我关心的是:正如鲍勃叔叔所描述的,控制器应该属于第三个圈子:接口适配器(从内到外)。这意味着控制器仅依赖于用例圈(第 2 圈),并且不应该对第 4 圈中的框架一无所知。

但是有些框架中的控制器必须扩展一个基类(例如,一个 AbstractController 类),它还需要接收一个 Request 对象,有时还需要返回一个 Response 对象,所以这有点打破了Clean Architecture 的依赖规则,因为它知道外圈的框架。

我误解了吗?如果没有,是否有任何解决方案可以不破坏依赖规则

我的控制器看起来像这样: