c# - 设计问题 - Dot-Net 3 层应用程序中的 ORM 与 OOP - 对象应该保持自身还是只有业务逻辑层应该调用 DAL
问题描述
我有一个使用一些业务对象的应用程序 - 例如“用户”。我有一个应该处理数据库调用的 DAL 层。
现在我想从数据库中获取 ID 为 100 的用户。有两种选择:
选项1:User user = new User(100);
选项 2:User user = BusinessLogicLayer.UserBL.GetUserFromID(100);
在选项 1 中 - 用户类是“自我维护的”,但如果我想保持层的分离 - 它需要访问 DAL 层并且 DAL 层需要知道这个对象(哪种创建循环引用)
在选项 2 中 - 用户类只是属性的集合。业务逻辑层和 DAL 层都知道它 - 但它本身没有能力(b/c 它被两者引用但不能引用它们)。
首选方法应该是什么?
解决方案
选项1:用户用户=新用户(100);
基于Clean Code
鲍勃叔叔等许多知名资源,数据结构应始终与其业务逻辑分开。在您的第一个选项中,User
两者都是data model
并且logic service
是错误的。
如果您还想删除用户或对其进行身份验证或...,您会怎么做?SOLID
第一种方法违反原则(特别是)非常不稳定SRP
。
选项2:用户user = BusinessLogicLayer.UserBL.GetUserFromID(100);
您应该有一个数据模型User
及其分离的业务逻辑类,如UserService
, AuthenticationService
, ... 并且这些服务使用您的DAL
(可能您基于Repository
和Unit of work
模式编写它)来获取数据并执行它们的功能。
推荐阅读
- php - 如何在 laravel 中的 with() 方法之后限制查询
- r-markdown - 在 pandoc 模板中获取第一作者 (Rmarkdown)
- clojure - Clojure:将原子的值设置为 true
- flutter - 如何在 Flutter 中设计卡片下方
- node.js - Redis 会话正在刷新来自 Angular HTTP GET 的每个新请求,但不是来自浏览器
- javascript - TypeError:无法读取未定义的属性“querySelector”
- javascript - 如何删除小数点后的最后两个数字?
- xamarin - 是否可以用纯 xamarin 按钮覆盖 Webview 按钮并单击它,同时单击网站按钮?
- android - google 把最新的 gradle 工具搬到哪里了
- vb.net - 在 vb.net 中创建文件到另一个位置