在 ASP.NET MVC 中实现 Onion 架构时,我的理解是我们应该/可以公开 IDataContext 接口,该接口可以在 UI 中注入和引用。
所以基本上在 ASP.NET MVC 中,我们可以这样做:
_context.Products.Add(myBadProduct);
那不是让 UI 层实现业务逻辑吗?我相信 Onion 的基本理念之一是它可以清楚地了解哪些代码进入了哪些层,并明确禁止 UI 层实现业务逻辑。
如果我们将存储暴露给 UI(有或没有SaveChanges
能力),我们让 UI 开发人员实现自定义业务逻辑。
这可以通过仅通过诸如此类的域服务将所有操作暴露给底层 IDataContext 来“修复”。
用一句话总结我的问题:
我们应该允许 UI 层接触 IDataContext 还是应该只通过域服务公开所有上下文操作?如果我们公开 IDataContext,是否也可以公开在 IDataContext 中定义的 SaveChanges 方法(例如在实际的 EfDataContext 中实现)?
我认为 IDataContext 应该公开为只读(即没有 SaveChanges 功能),用于查询目的,而 C_UD 方法应该公开为域服务。对还是错?