【问题标题】:Where do you put third party libs when following Clean and Hexagonal Architecture? [closed]遵循 Clean 和 Hexagonal Architecture 时,您将第三方库放在哪里? [关闭]
【发布时间】:2021-10-06 09:45:00
【问题描述】:

我一直在研究 Clean Architecture、Hexagonal Architecture 和实现我认为适用于我的应用程序的部分。我知道这两种架构都在谈论将您的域与外部世界分开。我读过的所有资源都使用控制器、CLI、存储库和 Twilio 等通信平台作为适配器的示例。我正在使用一个库来生成 JWT(JSON Web 令牌)。我的问题是,lib 的实现是属于域层还是域层之外。我之所以这么问,是因为我读过的所有资源都没有提到验证、JWT 和在外层生成 UUID 等库。它通常是我上面列出的东西,比如域外的控制器和数据库。

【问题讨论】:

  • 我会说这应该不是问题,因为这些应该始终由您的语言的依赖管理工具管理,例如,如果您正在使用 Typescript npm 或 Yarn。

标签: node.js typescript clean-architecture onion-architecture hexagonal-architecture


【解决方案1】:

正如您提到的,Hexagonal Architecture 关心外部通信,并且验证、JWT 和生成 UUID 等工具被视为core 应用程序的一部分(其中core 是应用程序的内部逻辑)。

关于Clean Architecture,在使用第三方库时,您应该使用自己的接口而不是直接使用他们的接口公开它们。

不好

//myService.js
class MyService {
    
    constructor(uuid){
        this.uuid = uuid;
    }

    save(...) {
        const id = this.uuid.v4(); // <--- hard to refactore if "uuid" will change its API
        ...
    }

}

//app.js
const uuid = require('uuid');

const MyService = require('./myService');
...
const FooService = require('./FooService');


const myService = new MyService(uuid);
...
const fooService = new FooService(uuid);



不错

//uuidFactoryProvider.js
function uuidFactoryProvider(uuid){
    return function uuidFactory() {
        return this.uuid.v4(); // <-- easy to refactore
    }
}

//myService.js
class MyService {
    
    constructor(uuidFactory){
        this.uuidFactory = uuidFactory;
    }

    save(...) {
        const id = uuidFactory();
        ...
    }

}

//app.js
const uuid = require('uuid');

const uuidFactoryProvider = require('./uuidFactoryProvider');
const MyService = require('./myService');
...
const FooService = require('./FooService');


const uuidFactory = uuidFactoryProvider(uuid);
const myService = new MyService(uuidFactory);
...
const fooService = new FooService(uuidFactory);

通过使用您自己的 API 包装第 3 方库,代码库将对库 API 的依赖时间降至最低。

【讨论】:

  • 谢谢。正如您所提到的,您会将库放在域中。我注意到您将 uuidFactory 传递给构造函数,我可以理解为什么。我很好奇为什么将uuidFactory 传递给构造函数,如果它是域的一部分,而不是从myService.js 内部导入它。 CA 提到使用依赖倒置来定义与外层交互的合约。 uuidFactory 不会像您对数据库或您正在调用的第三个 API 所做的那样被用于测试的模拟实现所取代,所以我想知道为什么要以这种方式传递它。 @丹尼尔
  • 实际上,如果为 myService 编写 unit-tests,我会模拟 uuidFactory。这就是我注入一切(服务、工厂和值)的原因。是的,我知道这有点过头了,但我学到了使用第 3 个 API 可以回来咬你的艰难方法:)
猜你喜欢
  • 2020-10-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-05-06
相关资源
最近更新 更多