这叫什么类型的建筑?

2024-05-04

对于我当前正在开发的 Web 应用程序 (ASP.NET MVC),我们采用以下架构:

  • Data Access Layer:将数据持久保存到任意数据库的逻辑
  • Domain:数据模型
  • Service Layer:业务逻辑(例如订单处理、账户管理等)
  • Controller:使用服务并向视图提供数据/从视图接收数据
  • View:用户的用户界面

本质上,我采取了Model并将其分成DAL, Service Layer and Domain。我觉得把所有的逻辑都塞进了Model使我的代码过于复杂。此外,我觉得它可以让我干净地表达我的业务逻辑,而不会让控制器做太多的工作。

那么我的问题是:这种类型的架构叫什么?

作为次要问题: 这种架构有意义吗?如果不是,我做错了什么吗?


根据域和服务层的薄/厚程度,您是否走在 DDD 的正确轨道上。 DDD 表示知识(即业务逻辑)应该被整合到领域模型中。将数据访问问题移至 DAL 符合 DDD,但我认为将业务逻辑移至服务层则不然。如果您有一个薄的域“数据模型”层(主要用于实体)和一个厚的服务层(主要用于“业务逻辑”),那么您可能有一个贫血区 http://martinfowler.com/bliki/AnemicDomainModel.html.

此外,从技术上讲,DDD 中不存在“服务层”。可能有一个“应用程序层”,但它应该很薄,并且只负责应用程序流/管理域类生命周期。这本质上就是控制器在 .NET MVC 中所做的事情,在 Web http 上下文中管理应用程序流。

如果将所有逻辑填充到模型中会使您的代码过于复杂,我有兴趣听听您所说的“过于复杂”的示例。您可以正确地对复杂的领域进行建模,或者您也有可能采用 DDD 模式来使事情变得简单。我想说,正如您在问题中列出的那样,拱门不是 DDD。我只是将其称为“分层架构”,但那是因为我更喜欢仅在谈论物理拱门时使用术语“层”。但是,您的逻辑架构是分层的。

我真的很喜欢达林在他的回答中与洋葱拱门的联系。我正在成为它的忠实粉丝,并且我发现它根本不是 DDD 所独有的。如果您的代码使用依赖注入来解决运行时实现的接口依赖关系,您可能会遇到某种形式的洋葱拱。例如,您是否在 DAL 中定义了任何接口?这些接口的实现是否在运行时解决?

这是我开始在新项目中使用的拱门示例。它是洋葱+DDD的组合:

  • API项目/程序集:所有其他层使用的通用接口、枚举、类和扩展方法。不需要与域分开,但可以。

  • Domain项目/程序集:所有实体和业务逻辑。依赖于取决于API仅有的。使用 DDD 模式,如工厂、服务、规范、存储库等。还包含更多 API 中未定义的特定于域的接口。

  • Impl项目/程序集:定义的接口的实现API and Domain。这是实现 EF DbContext 以及日志记录、电子邮件发送等的地方。所有这些实现都是依赖项注入的,因此从技术上讲,您可以拥有多个 Impl 项目/程序集。

  • UI项目/程序集:这是 MVC 项目。控制器直接使用域表面,不经过应用程序或服务层。工厂、服务、存储库等中的任何接口依赖项都由控制器使用 MVC IoC(构造函数注入)注入到域中。

我在最核心放置了一个 API 层,但您可以将 API 和域项目合并为一个。不管怎样,洋葱的大肉部分是领域,它有内部分层。例如,服务可能依赖于工厂,而工厂又依赖于存储库,而存储库又依赖于实体。

Impl 项目就是您在巴勒莫图中看到的“基础设施”洋葱皮。它与 UI 一起位于外边缘,并且不包含特定于领域的知识。它知道如何使用 EF 发送电子邮件、存储/检索数据等。如果您愿意,您可以拥有其中 1 个以上 — 例如 1 个用于数据访问的 Impl,1 个用于处理邮件的 Impl 等。

MVC 具有控制器和视图,并专注于 UI 和 Web 应用程序流程。任何需要特定领域知识的内容都被委托给域,并且域类通过构造函数注入到控制器中。这意味着域类中任何构造函数注入的接口都会由 IoC 容器自动解析。

最后一点,根据 API 和域类中定义的接口进行编程意味着您可以将域项目与 MVC 项目分开进行单元测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这叫什么类型的建筑? 的相关文章

随机推荐

  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • 如何在Python中打印带下划线的内容?

    print hello 输出应该是单词 hello 但有下划线 您可以通过使用转义字符来做到这一点 print 033 4mhello 033 0m
  • 从 Active Directory 同步数据库

    我想将我的用户数据库与活动目录中的用户和组同步 我的应用程序从 AD 读取对象并将它们复制到数据库 但随着 AD 更改而变得过时 有没有办法让活动目录在对象更改时通知我 C 示例代码会很棒 F bio 附 我正在使用 Oracle 数据库
  • 为什么要在项目中使用#include_next?

    引用iOS有关包装器标头的文档 http developer apple com library ios documentation DeveloperTools gcc 4 0 1 cpp Wrapper Headers html inc
  • 如何在外部 .js 文件中分离 .vue 组件的方法?

    我的组件留下了许多行代码 因此我决定将这些方法放在一个名为functions js 的单独文件中 我无法调用这些方法 我试过这个 函数 js function sendList function getLists function dele
  • Jsoup遍历DOM树时节点哈希码冲突

    我正在使用 java jsoup 构建 HTML DOM 树 其中Node hashCode 用来 但我发现在遍历DOM树时存在很多哈希码冲突 使用以下代码 doc traverse new NodeVisitor Override pub
  • 如何保存具有多个缩进设置的XmlDocument?

    我需要保存一个XmlDocument以适当的缩进归档 Formatting Indented 但有些节点及其子节点必须排在一行 Formatting None 从那时起如何实现这一目标XmlTextWriter接受整个文档的设置 在 Ahm
  • 设置正则表达式中的最小和最大字符

    我写了一个正则表达式 http en wikipedia org wiki Regular expression匹配任意数量的字母 字母之间有任意数量的单个空格 我希望该正则表达式也强制执行最小和最大字符数 但我不确定如何做到这一点 或者是
  • 如何使用 Objective-C 在 Mac Os X 中模拟 Unicode Char“按键”?

    我想在 Mac OS X 中模拟 unicode 字符发送到前台应用程序 我的意思是我有一个像 a 这样的unicode char 可以包含阿拉伯语 中文等 我想输入它 请注意 我并不是尝试使用虚拟按键或按键代码 只有一个角色 您忠诚的 佩
  • 悬停时连续 CSS 旋转动画,悬停时动画回到 0deg

    我有一个元素 当你将鼠标悬停在它上面时 它会无限旋转 当您将鼠标悬停在外面时 动画就会停止 简单的 webkit keyframes rotate from webkit transform rotate 0deg to webkit tr
  • 在 ios 7 设备上获取多个应用程序图标

    我在 ios7 iPhone5 设备 上遇到一个奇怪的错误 我在ios7上使用xcode5安装了iPhone应用程序我的问题是每当我在设备上安装应用程序时 我都会收到多个应用程序图标 多次使用相同的名称 我还尝试通过我的系统使用不同的应用程
  • FacebookCallback#onCancel() 在 Android 的 Facebook Sdk 4.2.0 中登录一次后调用

    我已经在 Android 应用程序中成功实现了 Facebook 登录 但现在 令人惊讶的是 当我使用 facebook 登录时 如果我尝试使用 facebook 库 4 2 0 登录 facebook 它的 onCancel 方法就会被调
  • 如何使用 pandas groupby 函数根据 groupby 值应用公式

    我的问题可能有点令人困惑 所以让我解释一下 我有一个信息数据框 我想按唯一订单 ID 对其进行分组 该 ID 将生成以下列 sum qty 每个订单 ID 执行的总金额 csv 这是每个订单 ID 的 csv 列的总和除以订单 ID 的已执
  • 使用 JavaScript 检测硬重新加载

    为了澄清 I am not试图区分刷新和重新加载 因此这不是重复的刷新与重新加载 https stackoverflow com questions 5004978 check if page gets reloaded or refres
  • codeigniter core/model.php 未定义属性

    我从未接触过 model php 文件 但是我收到了此错误 Jobprocess 是我的控制器 lastname是在其中正确分配的变量 我不知道为什么会出现这个错误 这是使用 codeigniter 框架 Message Undefined
  • pyspark:计算窗口上的不同值

    我刚刚尝试做一个countDistinct越过一个窗口并得到这个错误 AnalysisException 不支持不同的窗口函数 计数 不同颜色 1926 有没有办法在 pyspark 的窗口上进行不同的计数 这是一些示例代码 from py
  • 在同一台服务器上运行两个 PHP 版本

    我在本地服务器上有两个项目 一个项目运行PHP5 6 另一个项目运行PHP7 0 现在可以根据项目启用这两个版本吗 我已经尝试添加AddHandler application x httpd php7 php在 htaccess 项目之一中
  • 我从 clojure 和 python 中得到的 hmac 签名略有不同

    我从 python 实现和 clojure 实现中获得的 HMAC SHA1 签名略有不同 我很困惑什么会导致这种情况 Python实现 import hashlib import hmac print hmac new my key my
  • org.json.JSONArray 类型的值无法转换为 JSONObject

    陷入了这个错误 3169 3190 com meisolsson app E JSON 解析器 解析数据时出错 org json JSONException Value type 0 can see custom stories true
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等