领域模型与持久化实现
领域模型负责表示业务概念、有关业务状况的信息和业务规则。 反映业务状况的状态是通过这个层进行控制和利用的,但有关状态存储的具体技术细节则由基础结构负责实施。 这一层是业务软件的核心。
域模型层是表述业务的地方。 在 .NET 中实现微服务域模型层时,该层被编码为类库,具有用于捕获数据和行为(方法和逻辑)的域实体。
为遵循持久性忽略(Persistence Ignorance)和基础结构忽略(Infrastructure Ignorance)原则,此层必须完全忽略数据持久性细节。 应由基础结构层来执行这些持久性任务。 因此,此层不应在基础结构上设置直接的依赖关系,这意味着存在一个重要规则,即域模型实体类应为普通旧 CLR 对象(POCO)。
域实体不应在任何数据访问基础结构框架(如 Entity Framework 或 NHibernate)上具有任何直接的依赖关系(如派生自基类)。 理想情况下,域实体不应派生自或实现任何在基础结构框架中定义的类型。
大多数新式 ORM 框架(如 Entity Framework Core)允许使用这种方法,以确保域模型类不会耦合到基础结构。 但是使用某些 NoSQL 数据库和框架(如 Azure Service Fabric 中的执行组件和可靠集合)时,并不总是能够获得 POCO 实体。
即使在需要为域模型遵循持久性无感知原则的情况下,也不应忽略对持久性的关注。 仍然很有必要了解物理数据模型和模型映射到实体对象模型的方式。 否则就不可能创建设计。
但这种情况并不意味可以采用为关系数据库设计的模型,并将其直接移到 NoSQL 或面向文档的数据库。 在某些实体模型中,该模型或许适用,但通常是不适用的。 实体模型仍须遵循某些约束,这些约束基于存储技术和 ORM 技术。