遵循清洁和六边形架构时,您将第三方库放在哪里?
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。
我一直在研究简洁架构、六边形架构,并实现我认为适用于我的应用程序的部分。我知道这两种架构都在谈论将您的域与外界隔离开来。我阅读的所有资源都使用控制器、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。