我强烈建议你真的拥抱
关注点分离
软件设计负责人。
正如我的评论所说,一个新项目的“文件夹分离”基本上是在乞求一个“大泥球”软件项目。
在新项目中添加层(csprojs)非常简单。不这样做是非常非常短视的。
一般来说,如果有疑问,请选择“过度分离”。为什么?稍后“组合”的琐碎。巨大的头痛和“以后分开”的努力。
我的典型设置。
./src/BusinessServices/Optum.Flex.MyProject.BusinessServices.csproj
WebApi Layer. (and top layer for IoC "Compositon Root"). References everything below, except unit tests.
./src/BusinessLogic/Optum.Flex.MyProject.BusinessLogic.csproj
Business Logic. References Optum.Flex.MyProject.DomainDataLayer.Interfaces.csproj. and Domain.csproj. DOES NOT REFERENCE concrete EntityFramework.csproj.
./src/DomainDataLayer.EntityFramework/Optum.Flex.MyProject.DomainDataLayer.EntityFramework.csproj
Concrete DomainDataLayer. References Optum.Flex.MyProject.DomainDataLayer.Interfaces.csproj. and Domain.csproj.
Will also contain Orm-Entites, Orm-Maps.
Can also contain the "converters" from Orm-Entities to DTOS(pocos) and vice versa. (Use mapster or automapper or hand map)
./src/DomainDataLayer.Interfaces/Optum.Flex.MyProject.DomainDataLayer.Interfaces.csproj
Interfaces for DomainDataLayer.
The interfaces accept and return Domain objects, the DTOS/POCOS.
./src/Domain/Optum.Flex.MyProject.Domain.csproj
DTOS (or POCOS). Has ZERO REFERENCES TO ANY OTHER LIBRARY. Simple Pocos/Dtos.
./src/UnitTestProjects/UnitTests.EntityFramework/UnitTests.EntityFramework.csproj
./src/UnitTestProjects/UnitTests.BusinessLogic/UnitTests.BusinessLogic.csproj
./src/UnitTestProjects/UnitTests.Domain/UnitTests.Domain.csproj
我走得更远。
CQSP(命令查询分离主体)
https://martinfowler.com/bliki/CQRS.html
和
不要从其他服务“跨线”传递 ORM 实体。
https://thorben-janssen.com/dont-expose-entities-in-api/
这些问题以及由此引发的所有讨论主要有两个原因:
实体是 POJO。看起来它们通常可以很容易地序列化和反序列化为 JSON 文档。如果它真的那么容易工作,那么您的 REST 端点的实现将变得非常简单。
暴露你的实体会在你的 API 和你的持久性模型之间建立一个强耦合。两种模型之间的任何差异都会带来额外的复杂性,您需要找到一种方法来弥合它们之间的差距。不幸的是,您的 API 和持久性模型之间总是存在差异。最明显的是处理实体之间的关联。
https://jacquessmuts.github.io/post/modularization_room/
不要这样做。请。它打破了实现适当关注点分离的项目所要求的信息隐藏的核心概念。
映射您的实体
相反,您应该有两个不同的对象。您应该一个代表数据库实体(Orm-Entity)的对象(Java 这是 JPA Annotated Object,C# 这是 Orm-Attributed 对象(不太推荐)或 FluentMapped Orm-Entity)和一个对象(“Dto”或“Poco”)用于传递纯数据。您的数据库模块应该是唯一导入 Room 库的模块。如果任何其他模块导入了数据库模块的那些实现细节,那么您就不是应有的信息隐藏。
这个面包屑到“组合根”
https://blog.ploeh.dk/2011/07/28/CompositionRoot/