遵循清洁和六边形架构时,您将第三方库放在哪里?

Where do you put third party libs when following Clean and Hexagonal Architecture?

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

正如您提到的,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。