清洁架构中从网关到框架的依赖
Dependency from Gateway to Framework in Clean Architecture
假设我想实现一个基于 Uncle Bobs Clean Architecture 的 ASP.NET 应用程序。据我了解:
- Asp.Net本身就是框架圈
- Asp.Net 控制器将位于 gateways/interface 适配器层
- 我的业务逻辑在 usecases/entities 层
依赖规则说只允许从外圈到内圈的依赖。
据我了解,依赖规则不仅与控制流有关,而且与一般代码级依赖有关。
但是:为了在 "gateways" 圈子中有一个 Asp.Net 控制器,它必须派生自 Asp.Net 控制器 class.
问题:这会不会违反依赖规则,因为这会引入从 "gateways" 圈到 "frameworks" 圈的编译时依赖?
更新: 我在最近的博客中更详细地讨论了这个问题 post https://plainionist.github.io/Implementing-Clean-Architecture-AspNet/
是的,它违反了规则。
框架供应商并不关心它,相反,他们努力让我们的应用程序供应商锁定他们的框架。
所以我们应该根据项目需求来选择我们的技术栈,包括框架。如果是我们快速创建原型的需求,我们需要选择一个帮助我们做RAD的框架。如果需求告诉我们业务概念已经确立,应用会长期存在,那么我们需要选择一个框架,让我们的应用能够与框架和其他工具保持解耦,这样我们就可以方便地更新and/or 交换工具,包括框架。
例如,Symfony 允许我们将控制器与框架耦合或分离。当谈到 ORM 时,我们也有这个问题,Propel 迫使我们拥有扩展 Propel 实体的实体,而 Doctrine 允许我们拥有完全不知道 ORM 的实体。
假设我想实现一个基于 Uncle Bobs Clean Architecture 的 ASP.NET 应用程序。据我了解:
- Asp.Net本身就是框架圈
- Asp.Net 控制器将位于 gateways/interface 适配器层
- 我的业务逻辑在 usecases/entities 层
依赖规则说只允许从外圈到内圈的依赖。
据我了解,依赖规则不仅与控制流有关,而且与一般代码级依赖有关。
但是:为了在 "gateways" 圈子中有一个 Asp.Net 控制器,它必须派生自 Asp.Net 控制器 class.
问题:这会不会违反依赖规则,因为这会引入从 "gateways" 圈到 "frameworks" 圈的编译时依赖?
更新: 我在最近的博客中更详细地讨论了这个问题 post https://plainionist.github.io/Implementing-Clean-Architecture-AspNet/
是的,它违反了规则。
框架供应商并不关心它,相反,他们努力让我们的应用程序供应商锁定他们的框架。
所以我们应该根据项目需求来选择我们的技术栈,包括框架。如果是我们快速创建原型的需求,我们需要选择一个帮助我们做RAD的框架。如果需求告诉我们业务概念已经确立,应用会长期存在,那么我们需要选择一个框架,让我们的应用能够与框架和其他工具保持解耦,这样我们就可以方便地更新and/or 交换工具,包括框架。
例如,Symfony 允许我们将控制器与框架耦合或分离。当谈到 ORM 时,我们也有这个问题,Propel 迫使我们拥有扩展 Propel 实体的实体,而 Doctrine 允许我们拥有完全不知道 ORM 的实体。