繁体   English   中英

这叫什么类型的架构?

[英]What type of architecture is this called?

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

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

本质上,我采用了Model并将其分为DALService LayerDomain 我觉得将Model所有逻辑塞满会使我的代码过于复杂。 此外,我觉得它可以使我清晰地表达我的业务逻辑,而无需使控制器做过多的工作。

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

作为第二个问题 :这种类型的体系结构有意义吗? 如果没有,我做错什么了吗?

您对DDD的看法是正确的,具体取决于域和服务层的厚度。 DDD表示,知识(即业务逻辑)应纳入领域模型。 将数据访问问题转移到DAL与DDD一致,但是我认为将业务逻辑转移到服务层是不对的。 如果您有一个薄的“域”数据模型”层(主要用于实体)和一个厚的“服务”层(主要是“业务逻辑”),则您可能具有贫乏的域

同样,在DDD中,技术上也没有“服务层”。 可能有一个“应用程序层”,但它应该很薄,并且仅负责应用程序流/管理域类的生命周期。 实质上,这是Controller在.NET MVC中所做的工作,是在Web http上下文中管理应用程序流。

如果将模型中的所有逻辑塞满,会使您的代码过于复杂,那么我想听听“过度复杂”的含义示例。 您可能正在正确地建模复杂的域,或者有可能您已经使用DDD模式简化了事情。 我会说,正如您在问题中列出的那样,拱门不是DDD。 我将其称为“分层体系结构”,但这是因为我更喜欢仅在谈论物理拱门时使用“层”一词。 但是,您的逻辑体系结构是分层的。

我真的很喜欢达林在他的回答中链接到洋葱拱门。 我正在成为它的忠实拥护者,而且我发现它并不是DDD独有的。 如果您的代码使用依赖项注入来解决运行时实现中的接口依赖项,则您可能会有一种形式的洋葱拱。 例如,您是否在DAL中定义了任何接口? 这些接口的实现是否在运行时解决?

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

  • API Project / Assembly:所有其他层使用的通用接口,枚举,类和扩展方法。 不必与Domain分开,但可以。

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

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

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

我在最核心处放置了一个API层,但是您可以将API和Domain项目合并到一个。 无论哪种方式,洋葱的大肉部分都是“领域”,并且具有内部分层。 例如,服务可能取决于工厂,而工厂取决于存储库,而存储库取决于实体。

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

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

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

从高层次上讲,我将其描述为分层架构。 将其描述为域驱动的设计还将关注较小的模式,例如聚合,存储库,有界上下文等。我不能仅从您的描述中看出来。

如果域层位于不引用其他任何层的程序集/程序包中,则它具有Onion Architecture原则的核心,即:

  • 该应用程序围绕独立的对象模型构建
  • 内层定义接口。 外层实现接口
  • 耦合方向朝向中心
  • 可以编译所有应用程序核心代码,并与基础结构分开运行

要查找的具体内容是您的DataAccess是否引用Domain。

根据您从哪个角度看,可能会有不同的名称。 所以它仍然是MVC,只是将您的M分为多个层。 它也可以称为多层体系结构 (或N层体系结构)。 Jeffrey Palermo还使用了洋葱架构的概念。

由于您已将DAL与域模型分开,并且还具有服务层,因此您似乎正朝着DDD(域驱动的设计)迈进,这里是有关这种方法的讨论,可能会很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM