问题标签 [application-layer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - DDD:程序应用服务的 OOP 替代方案是什么?
我最近收到了 Scott Miller 和 Nick Tune 的《领域驱动设计的模式、原则和实践》一书。它在 C# 中有一些不错的示例,因此与我之前读过的其他 DDD 书籍有点不同,后者是 Java 中的。由于 C# 对委托和事件的支持,域事件实现非常简洁。
然而,有一点让我担心,正如书中应用服务一章所说,它应该是“程序化的风格和精简的”。我知道应用程序层应该是薄的,但为什么程序风格?我不想编写程序代码,否则我一开始就不会选择 DDD。我还发现这篇 stackoverflow 文章还标签应用程序服务是过程代码:
所以你看?应用程序服务在风格上是程序化的,而不是 OOP。这让我想知道我是否可以通过将应用程序服务的过程接口替换为 OO 接口来改进设计以使其更加 OO。本文建议方法对象会这样做,它是否有效?程序应用程序服务的更多 OO 替代方案是什么?谁能详细说明?
http://ayende.com/blog/2145/entities-services-and-what-goes-between-them
c# - 应用层单元测试在 DDD 中是什么样子的?
在我的工作中,我们正在编写由应用程序调用的 Web 服务。我们正在使用领域驱动设计以敏捷的思维方式工作。与 DDD 一样,我们有域和应用层。但是,我们在为这些层编写单元测试时遇到了问题,因为我们似乎在测试域逻辑两次:域单元测试和应用程序单元测试:
应用单元测试
领域单元测试
如您所见,这两个测试都检查用户余额是否为 0,这是域责任。因此问题是:应用层单元测试应该是什么样子,应该测试什么?在某处我读到单元测试应该在“用于流控制的应用程序服务和用于业务规则的域模型”中进行测试。有人可以详细说明并举例说明应用层单元测试应该测试和看起来像什么吗?
.net - 具有多步骤过程的应用程序层不使用域层是否可以
我正在开发具有以下层的 N 层 .NET 应用程序:
- 介绍
- 应用
- 领域
- 基础设施(包含持久性和常用实用功能,如电子邮件)
在我的申请中,某个请求被批准了。一旦获得批准,必须执行以下 4 个步骤:
- 将产品标签代码分配给请求中的已发行产品。
- 将请求状态从“正在处理”更新为“订单已完成”</li>
- 向请求者发送一封电子邮件,说明他们的产品已准备好取货
- 向请求者的经理发送一封电子邮件,告知他们已向他们的员工提供了什么以及他们批准的产品请求的副本
上述步骤必须是原子操作的一部分,这意味着它们必须全部完成,否则操作将被取消。我正在考虑让应用层指导请求存储库和持久层执行以下任务:
- 应用层请求请求存储库执行步骤 1 和 2 作为工作单元事务
- 应用层请求基础设施层执行步骤 3 和 4。
我不确定应用层是否应该这样做。我认为这是因为前两个操作需要联系我在域层中避免做的存储库。最后两个步骤涉及基础设施层,域层可以通过依赖注入实例与之对话。按照这个逻辑,应用层并不要求领域层做任何事情。当你有一个应用层时,这通常是这样的多步骤过程吗?还是我在这里错过了什么?
我知道一个名为 Windows Workflow 的框架,但我不确定这在这种情况下是否会有所帮助,因为这个多步骤过程不涉及处理步骤中的人机交互,而事情可能会等待几天。如果我不需要的话,我也不想让应用程序过于复杂。
提前致谢。
entity-framework - 是否应该将应用服务注入到域服务中
我正在使用具有以下层的 Entity Framework 6 开发 WinForms 应用程序:
- 介绍
- 应用
- 领域
- 基础设施
当用户从 UI 中单击保存按钮时,它会调用应用程序层中的应用程序服务并传入请求。然后,应用程序服务使用该请求调用域服务。域服务调用域模型中的多个实体来对请求中使用的数据执行验证。
域模型中的一个或多个验证需要来自存储库的信息,以确定从表示层接收到的请求中的数据是否符合某些业务规则。
我正在考虑两种选择来解决这个问题。
让应用程序服务从存储库中检索验证所需的信息,并将这些值传递给域服务,域服务将调用域模型和实体来验证传入的规则和值请求。然后让应用服务在域服务完成验证后保存请求,这将导致将控制权返回给同步等待验证完成的应用服务。如果我这样做,那么域层将没有对存储库的直接或间接(注入)引用。如果我这样做,域服务的单元测试会更容易,因为没有注入任何东西来执行验证。它需要的一切都已经传入。
在调用域服务以验证请求时,将应用程序服务的实例注入其中。然后,域服务可以使用注入的应用程序服务从存储库中获取信息,其服务合同在域层中定义。一旦所有信息都可用,它会根据需要传递给各种实体以验证规则和值。验证完成后,域服务使用注入的应用程序服务保存请求。当域服务完成并退出时,它会将保存操作的状态返回给一直在等待验证完成的应用程序服务。外部等待的应用程序服务然后可以将保存的结果返回给 UI。
哪种选择或其他行动方案会更好?提前致谢。
domain-driven-design - 使用 DDD 在分层应用程序中应在何处声明数据传输对象 (DTO)
我曾经在域层中声明我的 DTO。但那是在我后来理解应用层应该将原语传递给域层以实例化域模型实体而不是 DTO 之前。既然我知道了这一点,我就不需要在域层中声明 DTO。
由于我的应用程序层具有应用程序服务,可以将数据与 DTO 相互转换以将数据传输到各个层,因此我认为 DTO 也可以在应用程序层中声明。
那么,应用层通常是应该声明 DTO 的地方吗?
提前致谢。
更新:2016 年 2 月 25 日我将根据 .NET 应用程序架构指南第 2 版中的以下引用在应用程序服务层中为我的应用程序服务定义接口:“在服务层中,您定义和实现服务接口和数据合同”..
c# - 应用服务属于领域层还是应用层?
我有一个具有 4 层的 N 层 Winforms 应用程序,如下所示:
表示层
应用层
领域层
基础设施层
我的应用程序层有一个产品服务类,用于产品的所有存储库相关操作。
产品服务类的接口文件属于应用层还是领域层?我问是因为我的存储库的接口文件是在域层中定义的,即使它们是在基础设施层中实现的。
提前致谢。
c# - 哪个层或服务应该联系存储库以获取域实体验证所需的额外数据
我在这里简化了问题以缩小焦点:
当需要来自存储库的数据时,有哪些推荐的方法可以在域层中执行实体构造验证?
例如,考虑在创建实体之前需要通过以下验证规则:
规则 1:申请手机的员工必须在 ABC 公司工作 6 个月或更长时间
域层中实体可用的信息源自 UI,后来从应用层中的订单服务传入,没有足够的信息来执行上述示例规则。需要从存储库中查询以返回员工的雇用日期,以计算他们是否工作了 6 个月或更长时间。
问题
问题是此时应该联系存储库的哪个层或服务以获取验证规则 1 所需的员工雇用日期?除非规则 1 通过并且实体的其他数据值也通过,否则域实体不被视为有效。
提前致谢。
sockets - 应用层协议 - 不同大小的数据包
假设我在 TCP 之上为即时消息定义了自己的应用层协议。我为消息使用了数据包结构。当我使用对称 (AES) 和非对称 (RSA) 加密时,我会为不同的消息类型获得不同的数据包大小。现在回答我的问题。
如何从我收到单个应用层数据包的套接字中读取?我应该指定什么尺寸?
提前致谢。
我有两种方法。
从 TCP 流中读取代表实际数据包大小的固定数量的字节,最后从流中重新读取之前收集的字节大小。
从流中读取最大数据包大小。验证获得的字节的实际大小并确定它是哪种消息类型。
现在,一个更普遍的问题。我应该提供数据包大小、加密方法、接收方、发送方等元数据吗?如果是,我是否也应该加密这些元数据?
json - 使用 JSON 的实时 API
我希望将 Web 套接字上的命令发送到后端。我在想我的协议应该是这样的:
发送:{cmd: "login", data: {user:"Me",id:99}}
回复:{cmd: "login", data: "OK"}
发送:{cmd: "join sensors", data: {group:1}}
回复:{cmd: "join sensors", data: "OK"}
发送:{cmd: "join actuators", data: {group:1}}
回复:{cmd: "join actuators", data: "NOK"}
在发出新请求之前,我将始终等待响应。
我还可以从 BE 接收事件:
{evt:"sensor update", data: {id:1,value;20}}
我的设计合理吗?有没有更标准化的方法?
exception - 应用程序级别的软件中断和异常示例
我对两者的理解都不太清楚。网上很多人都说两者是一样的。有几个问题与我的问题类似,但是它们都没有在软件级别给出一个很好的现实生活示例。
有人可以给我一个明确的例子,这将帮助我理解彼此之间的差异吗?
例如,除以零是软件中断吗?还是一个例外?