Clean Architecture中Gateways与Adapters的最优结构选型(TypeScript+TDD)
Clean Architecture + TypeScript 网关与适配器方案选型咨询
我正在开展一个基于Clean Architecture、TypeScript和TDD的项目,核心关注点是正确构建网关(Gateways)和适配器(Adapters),尤其是数据库适配器。
有观点建议避免使用类以减少开销与资源占用,基于此我探索了两种结构方案:
- 方案一:将网关定义为接口,适配器作为接口的实现;
- 方案二:将网关定义为接收适配器作为参数的高阶函数(返回函数的函数);
我已完成两种方案的简易实现。方案一更安全,为适配器提供清晰的契约,且更直观;方案二则通过在网关中插入逻辑实现更高灵活性,但代价是安全性降低、复杂度提升。
现寻求社区的看法与建议:哪种方案更推荐?原因是什么?能否针对我实现的结构提供示例或反馈?
以下是代码片段供参考:
网关代码示例
interface OrderGateway1 { getAll: () => Promise<Order[] | undefined> getById: (orderId: string) => Promise<Order | undefined> } const orderGateway2 = (orderDbAdapter: any) => { return { getAll: (): Order[] => orderDbAdapter.getAll(), getById: (orderId: string): Order => orderDbAdapter.getById(orderId), } }
内存存储适配器代码示例
const orderInMemoryDbAdapter1: OrderGateway1 = (() => { const ordersDb: Order[] = [...inMemoryDb.orders] return { getAll: () => Promise.resolve(ordersDb), getById: (orderId: string) => Promise.resolve(ordersDb.find((order) => order.id === orderId)), } })() const orderInMemoryDbAdapter2 = () => { const ordersDb: Order[] = [...inMemoryDb.orders] return { getAll: () => ordersDb, getById: (orderId: string) => ordersDb.find((order) => order.id === orderId), } }
JSON Server存储适配器代码示例
const orderJsonServerDbAdapter1: OrderGateway1 = { getAll: async (): Promise<Order[] | undefined> => { const result = await api.get<Order[]>('/orders') return result }, getById: async (id: string): Promise<Order | undefined> => { const result = await api.get<Order>(`/orders/${id}`) return result }, } const orderJsonServerDbAdapter2 = () => { return { getAll: async (): Promise<Order[] | undefined> => { const result = await api.get<Order[]>('/orders') return result }, getById: async (id: string): Promise<Order | undefined> => { const result = await api.get<Order>(`/orders/${id}`) return result }, } }
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

