Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 洋葱架构中的典型层是什么?_C#_.net_Architecture_Domain Driven Design_Onion Architecture - Fatal编程技术网

C# 洋葱架构中的典型层是什么?

C# 洋葱架构中的典型层是什么?,c#,.net,architecture,domain-driven-design,onion-architecture,C#,.net,Architecture,Domain Driven Design,Onion Architecture,我目前正在研究领域驱动设计,并尝试将其应用于WPF项目。我看了一些教程视频,读了很多文章,比如: 我理解对接口和控制反转的关注。我读过一些经常出现的层名称(表示知识领域的域/核心、持久性基础设施、应用程序……我不明白),但它们会随着我读的文章的不同而变化。有些甚至没有出现 有没有可能列出洋葱架构中理论上需要面对所有需求和问题的所有层,以及它们的意图(它们包含什么样的代码,它们试图满足什么样的需求,它们需要引用哪一层),请?只是一些个人经验,我使用Eric Even的DDD书中提到的架构

我目前正在研究领域驱动设计,并尝试将其应用于WPF项目。我看了一些教程视频,读了很多文章,比如:

我理解对接口和控制反转的关注。我读过一些经常出现的层名称(表示知识领域的域/核心、持久性基础设施、应用程序……我不明白),但它们会随着我读的文章的不同而变化。有些甚至没有出现


有没有可能列出洋葱架构中理论上需要面对所有需求和问题的所有层,以及它们的意图(它们包含什么样的代码,它们试图满足什么样的需求,它们需要引用哪一层),请?

只是一些个人经验,我使用Eric Even的DDD书中提到的架构:

简言之:

1) 接口由负责与用户(真正的端点用户或远程机器)、web mvc控制器、web视图对象、远程外观等交互的组件组成

2) 应用程序定义系统提供的功能。我认为它与接口层高度耦合。若在应用程序中定义方法,通常还需要添加接口类/方法。但是,多个接口类/方法可能依赖于同一个应用程序对象,例如,为下订单提供web ui和web服务

3) 域,系统中最稳定的部分。例如,在语言上下文中,单词/句子是有其自身含义的领域对象,我对它们进行了组织以形成这个答案。所以你可以把我当作一个应用对象,虽然不是很好,因为我不会说流利的英语:P

4) 实际上,我不认为这是一个层,它实现了以上三个。例如,您的域层中有一个接口OrderRepository,您可以使用某种orm框架(持久性基础设施)来实现它。我的大多数基础结构对象都是适配器(在应用程序/域/接口层实现接口,并适应外部组件,如数据库、消息传递提供程序、邮件服务器等)

希望这有帮助

针对基础架构目的的更新:

这是我们项目的包视图之一

基础结构层中有一些适配器:

1.infrastructure.channel.XXX每个包都包含多个特定在线支付提供商的适配器

2.infrastructure.payment包含到我们组织的支付系统的适配器,但它位于另一个受限上下文中。我们使用MakePaymentService(域服务)将支付系统与该系统的其他部分分离

3.infrastructure.messaging包含到消息传递提供程序的适配器,我们为PaymentWasMadeNotifier(应用程序服务)提供jms实现

4.infrastructure.persistence包含数据库适配器,我们为域存储库提供了iBATIS(Java中的orm框架)

以上这些适配器都在应用程序/域层中实现了一些接口。 下面是一些“服务”,但它们是通用的:

5.infrastructure.mail

6.1.1日志记录

7.基础设施安全

上面的这些包公开了一些接口和实现。例如,我们提供了一个MailManager接口,它与特定功能无关。主题、内容取决于应用程序层/域层。我们在同一个包中提供了一个使用javamail的实现

public interface MailManager {
void send(String subject, String content);
}
8.infrastructure.time这一项很特殊,我们在这个系统中有一些cron作业,因此我们引入了一个时钟,将时间与作业设置分离,因此它对测试很友好(想象一下,我们有一个作业,它应该在25号启动,每个月,我们可以通过将当前时间设置为25号来测试作业,即使今天是1号)。我们在持久性包中提供了一个实现(出于某些原因,我们需要使用数据库的生产时间)


所以我的理解是:基础设施为其他三层提供服务/实现,但它们是特定于技术的。例如,Subject、content、from、to、cc是邮件上下文中的域模型,但它们是域上下文中的基础结构。基础设施层为您将它们分开。

完全同意Hippoom的答案。从那里开始是完美的

现在,

我读到有一些经常出现的层名称(域名/核心层) 知识领域、基础设施的表示 坚持,申请…我不明白),但他们会改变, 取决于我读的文章。有些甚至没有出现

是的,关于应用程序中的层的决策取决于特定场景中的许多因素。这就像一所大学如何划分课程和制定课程。这取决于他们想要服务的能力/多样性、手头的需求和大学的宗旨。在全球范围内,它的细节(命名和分区)非常不同,但其核心和意图总是相同的

同样,应用程序中的层取决于需求和范围。有时,架构师会根据他们在组织中遵循的理念和惯例来定义层的名称。因此,有时意图和名称可能会在某种程度上有所不同。但是,拥有可销售、可维护和满足现有需求的代码思想始终是一样的

从理论上讲,有没有可能列出所有层, 需要在洋葱架构中面对所有需求和问题, 他们的意图(他们包含什么样的代码,什么样的 他们需要完成什么,需要参考哪一层), 求你了

希波姆已经做得很好了,他也在镜头中描述了他的意图。
此处描述了标准层: public interface Clock { Date now(); }