ASP.NET Core中Clean Architecture扩展方法文件夹放置位置咨询
在ASP.NET Core Clean Architecture中放置扩展方法的最佳实践
扩展方法的存放位置完全取决于它所扩展的类型所属的层次,严格遵循Clean Architecture的依赖规则(内层不依赖外层,外层依赖内层):
1. 领域层(Domain)中的扩展方法
如果扩展的是领域层核心类型(实体、值对象、枚举、领域服务接口等),直接在Domain项目下创建Extensions文件夹存放:
- 示例:扩展
Order实体的CalculateTotal()方法,放在Domain/Extensions/OrderExtensions.cs - 注意:这里的扩展方法只能依赖Domain层内部类型,不能引用Application、Infrastructure或Presentation层的代码。
2. 应用层(Application)中的扩展方法
针对应用层类型(DTO、MediatR请求/响应对象、应用服务接口等)的扩展,放在Application项目的Extensions文件夹:
- 示例:扩展
OrderDto的MapToOrder()转换方法(映射到Domain的Order实体),放在Application/Extensions/OrderDtoExtensions.cs - 注意:可以依赖Domain层,但不能依赖Infrastructure或Presentation层的实现类。
3. 基础设施层(Infrastructure)中的扩展方法
针对基础设施层具体实现类(EF Core的DbContext、第三方服务客户端、仓储实现等)的扩展,放在Infrastructure项目的Extensions文件夹:
- 示例:扩展
AppDbContext的SeedData()初始化方法,放在Infrastructure/Extensions/AppDbContextExtensions.cs - 注意:可以依赖Domain和Application层,允许引用外部库(比如EF Core、HttpClient等)。
4. 表现层(Presentation)中的扩展方法
针对ASP.NET Core相关类型(Controller、HttpContext、ViewModel、中间件等)的扩展,放在Presentation项目的Extensions文件夹:
- 示例:扩展
ControllerBase的AddAppNotification()方法,放在Presentation/Extensions/ControllerExtensions.cs - 注意:可以依赖前面所有层,以及ASP.NET Core的框架组件。
5. 通用工具类扩展
如果是不绑定任何业务逻辑的通用扩展(比如字符串、集合、日期的通用处理方法),可以创建独立的Shared(或Common)项目,在其中创建Extensions文件夹存放,所有其他层都可引用该项目。
内容的提问来源于stack exchange,提问作者Regestea
相关产品推荐
相关产品推荐

