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

马特·卡夏特(Matt Cashatt)

设置

.NET,C#,WebAPI,使用代码优先迁移的实体框架

概括

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

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

-API -BLL-存储区

问题

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

似乎可以使用数据传输对象解决方案,但这似乎很愚蠢,因为它们与存储库中的域模型基本相同。那并不需要太多的抽象。

替代?

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

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

  • API(因为我已经在API中设置了OWIN身份验证)
  • 资料库
  • DomainModels(因为我使用的是代码优先迁移)

任何帮助表示赞赏。

迈克·SW

该存储库位于我的堆栈的底部,当前包含我的域模型

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

同样,您的域模型应该与持久性模型不同(作为一个概念),也就是说,您与EF一起使用的pocos用于处理CRUD。域对象是根据业务视图建模的,持久性pocos的设计考虑了db的使用(存储/易于查询)。

域层应该是核心,持久性和应用程序服务应该使用它,即依赖它。您可以看一下洋葱体系结构或业务组件/垂直切片(这是IMO的一种更高级的方法)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不创建模型的情况下插入对模型的引用?

如何在不创建特定域模型的情况下忽略命名查询中的字段

如何在不创建套接字文件的情况下使用Unix域套接字

如何在不创建数据库中相应表的情况下创建EntitySet或模型-Entity Framework

如何在不创建新环境的情况下使用yml文件安装python库列表

使用python的枕头库:如何在不创建图像绘制对象的情况下绘制文本

Pyomo:如何在不声明名称的情况下创建新的模型变量,然后将其存储在字典中?

如何在不创建变量的情况下使用 Javascript?

如何在不访问数据库的情况下创建具有延迟字段的Django模型实例?

如何在不写入文件系统的情况下从Google存储桶还原Tensorflow模型?

在不使用github存储库的情况下创建库

如何在不创建数据库集合的情况下创建动态输入列表

Cakephp:如何在不创建模型/控制器的情况下获取表数据?

如何在不创建副本的情况下增加 Laravel 模型的数量

Swift:如何在不增强其他对象的情况下创建对它的引用?

Perl:如何在不创建副本的情况下将数组引用转换为数组

Perl:如何在不创建数组副本的情况下取消引用数组?

如何在不添加远程的情况下将提交推送到 git 存储库?

如何在不设置全局凭据的情况下提交共享存储库?

如何在不更改主分支的情况下更改本地 git 存储库的功能分支?

如何在不每次输入密码的情况下将更改推送到远程存储库?

如何在没有数据库的情况下创建Yii2模型

如何在不创建表的情况下将动态查询的结果存储在临时表中?

如何在不丢失分支的情况下将mercurial存储库转换为git存储库?

如何在没有主键的情况下创建Spring实体和存储库

从存储库获取时,Doctrine如何在不调用__construct方法的情况下创建实体?

JPA如何在不创建表的情况下查询数据库

如何在不使用过程名称作为字符串的情况下使用存储库模式调用存储过程

如何在不制作模型的情况下使用Keras图层