- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我首先使用 Entity Framework 6 数据库。我正在转换项目以实现洋葱架构,以实现更好的关注点分离。我阅读了许多文章并观看了许多视频,但在决定我的解决方案结构时遇到了一些问题。
我有 4 个项目:核心、基础设施、Web 和测试。
据我所知,.edmx 文件应该放在我的“基础设施”文件夹下。但是,我还阅读了有关使用存储库和工作单元模式来协助 EF 解耦和使用依赖注入(inject)的信息。
话虽如此:
最佳答案
数据库优先并不能完全排除洋葱架构(又名端口和适配器或六边形架构,所以如果您看到对它们的引用,它们是相同的),但这肯定更难。洋葱架构和它允许的关注点分离非常适合领域驱动的设计(我想你在推特上提到你已经看到了some of my videos on this subject on Pluralsight)。
您绝对应该避免将 EDMX 放在核心或 Web 项目中 - 基础设施是这样做的正确位置。那时,使用数据库优先,您将在基础架构中拥有 EF 实体。不过,您希望您的业务对象/域实体存在于 Core 中。那时,如果您想继续沿着这条路走下去,基本上有两种选择:
1)从数据库优先切换到代码优先(可能使用工具),以便您可以在 Core 中拥有 POCO 实体。
2) 在基础设施实体和核心对象之间来回映射,可能使用 AutoMapper 之类的东西。在 EF 支持 POCO 实体之前,这是我使用它时遵循的方法,我将编写仅处理 Core 对象但在内部将映射到 EF 特定实体的存储库。
至于您关于存储库和工作单元的问题,已经在 SO 和其他地方写了很多关于此的文章。您当然可以使用通用存储库实现来允许对大量实体进行轻松的 CRUD 访问,这听起来可能是您在场景中前进的一种快速方法。但是,我的一般建议是避免将通用存储库作为访问业务对象的首选方式,而是使用聚合(请参阅 DDD 或我在 Pluralsight 上与 Julie Lerman 合作的 DDD 类(class)),每个聚合根都有一个具体的存储库。您也可以将复杂的业务实体从 CRUD 操作中分离出来,并且只在需要的地方遵循聚合方法。您从这种方法中获得的好处是您限制了访问对象的方式,并且在您的(大型)数据库实体集上获得了与 Facade 类似的好处。
不要觉得每个应用程序只能有一个 dbcontext。听起来您正在随着时间的推移不断发展这种设计,而不是从绿色应用程序开始。为此,您可以保留 .edmx 文件,也许还有一个通用存储库用于 CRUD 目的,然后为一组特定的操作创建一个新的代码优先 dbcontext,这些操作保证 POCO 实体、关注点分离、提高可测试性等。随着时间的推移,您可以转移大部分基本代码来使用它,同时仍然保留现有的 dbcontext,这样您就不会丢失当前的功能。
关于entity-framework - Entity Framework 6 数据库优先和洋葱架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24392181/
我无法理解六边形(端口适配器)架构中依赖的含义。 Here他们有漂亮的照片。我没有看到的是与 n 层结构有什么区别(实现)。 在 onion/hex 架构中,inner 层应该独立于outer 层,但
我是一名优秀的程序员,十分优秀!