我在.NET核心5中使用DDD和Onion架构构建了一个web应用程序。
有四个层次:
通过API层对基础结构层的引用只能连接到数据库,对数据库的任何请求都将通过应用层进行;应用层具有在基础结构层中实现的接口,以便从数据库中保存和检索数据。
现在,当我使用代码优先或数据库优先方法创建数据库时,这些EF模型类应该去哪里?
将它们放置在域层将破坏洋葱体系结构,因为域层不应该知道任何有关基础结构层的信息。
我看到了两个示例,其中模型和映射放置在域模型中,这些映射用于基础结构层OnModelCreating(..)
中,但是在域层仍然存在特定于数据库的基础结构层映射。如果我想用其他数据库替换基础结构层,那么我需要更改域模型,这对我来说是不合适的。
我可以将EF模型类放置在基础结构层,但是如何在应用程序层中引用它们呢?我是否需要为每个模型存储库提供一个接口,还是对同一个接口存在多个依赖项注入?
我希望域模型由业务模型保存,并将EF模型放置在基础结构层,并在必要时使用AutoMapper在它们之间映射。
那么,举行EF模型的最佳实践是什么,这样才不会破坏洋葱的建筑。
发布于 2020-12-28 14:22:19
如果您正在使用EF Core,我不认为需要有单独的EF模型。
我通常做的是在域层实现域模型类,这是它最好地支持我的业务逻辑的方式。然后,在基础结构层中,将实体框架配置类与泛型一起使用IEntityTypeConfiguration。
这正是被认为是为了使域模型类不受基础设施问题影响而使用的方式,这样即使您更改了数据库实现,域模型也永远不会改变。
您可以在微软的EShopOnContainers参考项目中看到一个工作示例EShopOnContainers。
例如,订单聚合在域层中定义,而EF的对应模型配置类则放置在基础结构层中。
然后,一切都像往常一样连接到API项目启动中,在基础结构层中连接相应的DbContext (OrderingContext)类。
基础结构层将依赖域层的域实体,而不是反过来,这是您希望在洋葱体系结构中实现的。
发布于 2020-12-28 10:49:07
您可以让基础设施层从EF核心检索数据并将其映射到域层,您必须为每个存储库提供一个接口,以返回域模型。至于同一接口的不同实现,您总是可以构建某种工厂来处理这个问题。有点像这的答案。
https://stackoverflow.com/questions/65474540
复制相似问题