您对以下“通用”代码优先洋葱启发的 ASP.NET MVC 架构有何看法:
层,解释:
核心- 包含领域模型。例如,这就是业务对象及其关系。我正在使用实体框架来直观地设计实体及其之间的关系。它让我为数据库生成一个脚本。我得到了自动生成的类似 POCO 的模型,我可以在下一层(持久性)中自由地引用它们,因为它们很简单(即它们不是特定于数据库的)。
持久性- 存储库接口和实现。基本上是域模型上的 CRUD 操作。
BusinessServices - 存储库周围的业务层。所有的业务逻辑都应该在这里(例如GetLargestTeam()
,等等)。使用 CRUD 操作来组合返回对象或获取/过滤/存储数据。应包含所有业务规则和验证。
Web(或任何其他 UI) ——在这种特殊情况下,它是一个 MVC 应用程序,但该项目背后的想法是提供 UI,由业务服务提供的驱动。UI 项目使用业务层并且无法直接访问存储库。MVC 项目有自己的 View 模型,它们特定于每个 View 情况。我不是想强制喂它领域模型。
所以引用是这样的: UI -> 业务服务 -> 存储库 -> 核心对象
我喜欢它的地方:
- 我可以设计我的对象,而不是手动编码。我正在获取代码生成的模型对象。
- UI 由业务层驱动/强制执行。不同的 UI 应用程序可以针对相同的业务模型进行编码。
百感交集:
- 好吧,我们有一个可插入的存储库实现,但是你真的多久有一次相同持久性接口的不同实现?
- UI 也是如此——我们拥有针对相同业务规则实现不同 UI 应用程序的技术能力,但是当我们可以简单地呈现不同的视图(移动设备、桌面设备等)时,我们为什么要这样做呢?
- 我不确定 UI 是否应该只通过视图模型与业务层通信,或者我应该像现在一样使用域模型来传输数据。对于显示,我使用视图模型,但对于数据传输,我使用域模型。错误的?
我不喜欢的:
- 现在在所有其他项目中都引用了核心项目 - 因为我想要/必须访问域模型。在经典的 Onion 架构中,核心仅被下一层引用。
- DbContext 是在 .Core 项目中实现的,因为它是由实体框架生成的,位于 .edmx 所在的相同位置。我实际上想使用 .EDMX 进行可视化模型设计,但我觉得 DbContext 属于 Persistence 层,位于特定于数据库的存储库实现中的某个位置。
作为最后一个问题 - 什么是一个没有过度设计的好架构(例如成熟的洋葱,我们有注入,服务定位器等),但同时在你会的地方提供了一些合理的灵活性真的需要吗?
谢谢