使用存储库模式,我如何在不创建泄漏抽象的情况下引用我的领域模型?

Using the repository pattern, how do I reference my domain models without creating a leaky abstraction?

设置

.NET、C#、WebAPI、Entity Framework 使用代码优先迁移

总结

我正在使用存储库模式设计 .NET 解决方案。存储库位于我的堆栈底部,目前包含我的领域模型。我在存储库顶部有层(例如 BLL),最后我在堆栈顶部有一个 API 层,其中包含我的 RESTful API 端点。

这是当前解决方案堆栈的简化伪图:

-API -BLL -REPOSITORY

问题

在 API 层中,我想在每个控制器端点内使用 .NET 的 ModelState 验证。问题是,这需要 API 层引用(因此了解)Repository 层。 这不会是一个有漏洞的抽象吗?

似乎使用数据传输对象是解决方案,但这几乎看起来很愚蠢,因为它们在本质上与存储库中的域模型相同。这不允许太多抽象。

替代方案?

我正在考虑添加一个单独的项目来包含域模型,然后允许 API、BLL 和存储库都引用该项目。有什么理由不应该这样做?

我在这里看到的唯一缺点是现在我的解决方案中的三个项目需要访问数据库:

感谢任何帮助。

The repository sits at the bottom of my stack and currently contains my domain models

那是你的问题,存储库 使用 域实体,但不包含它们。回购协议是持久性的一部分,您的领域模型应该是领域层的一部分。回购接口也是域的一部分。

此外,您的域模型(作为一个概念)应该不同于您的持久性模型,即您使用 EF 来执行 CRUD 操作的 pocos。域对象根据业务视图建模,持久性 pocos 设计时考虑了数据库使用(store/easily 可查询)。

领域层应该是核心,持久化和应用服务应该使用它,即依赖它。您可以查看 onion architecture 或业务组件/垂直切片(IMO 是一种更高级的方法)