我们头开始,从简单的单项目解决方案,逐步添加业务逻辑的约束,从应用逻辑和领域逻辑两方面考虑,从简单的单个项目逐步搭建一个多项目的解决方案。主要内容:
(1)搭建应用逻辑和领域逻辑都简单的单项目

(2)为应用逻辑复杂的单项目添加应用服务

(3)为领域逻辑复杂的单项目添加领域行为

(4)Application膨胀时,分离Application项目

(5)分离Infrastructure项目

(6)添加Web服务支持

(7)Web服务器负载均衡的支持

(8)其他方面的扩展支持

1.搭建应用逻辑和领域逻辑都简单的单项目

业务逻辑简单,主要的用例和CURD几乎一一对应,没有区分应用逻辑和领域逻辑的必要。

(1)搭建单项目解决方案:Example,项目类型为ASP.NET MVC

(2)添加Application文件夹,添加IRepository<T>接口。

(3)在Application文件夹中添加Domain文件夹,使用POCO作为实体。

(3)添加Infrastructure文件夹,添加Dependency文件夹,添加IContainer和IoCContainer实现,添加Repository文件夹和EfRepository<T>实现。

(4)添加Web文件夹,添加IoCControllerFactory实现,在Controller中通过构造注入IRespository<T>。

2.为应用逻辑复杂的单项目添加应用服务

业务逻辑复杂的原因更多体现在流程控制上而非领域逻辑上,因此我们对上文的项目进行改造。

(1)Application文件夹中添加Service文件夹,通过ApplicationService接口来抽象应用逻辑,在实现ApplicationService接口时通过构造注入IRepository<T>。

(2)在Controller不在直接依赖IRepository,在Controller中通过构造注入IApplicationService。

3.为领域逻辑复杂的单项目添加领域行为

领域逻辑复杂表现在过多的直接通过属性进行实体状态判断并多次赋值,一般情况下这些代码可以通过重构添加到实体。

(1)从ApplicationService中分离出与流程控制无关的代码。

(2)对实体类添加行为,实体类的public方法的定义分离到实体接口中,其他方法为私有方法。

此时的项目结构如图所示:

4.Application膨胀时,分离Application项目

Application是项目的核心,本身都是业务逻辑相关的代码,即使对其他类库有依赖也可以通过接口隔离方式消除,因此在Application代码膨胀时,无论是应用逻辑和领域逻辑哪种原因,都应该分离Application项目,更重要的意义在于我们需要对Application项目进行单元测试。事实上复杂一些的项目,我们一开始构建的就是Application项目及其单元测试。

(1)在解决方案中添加Example.Application项目。

(2)将Example项目中的Application文件夹下的全部文件迁移到Example.Application项目中,这样无需修改命名空间。

(3)修改Example项目添加Example.Application项目的引用。

此时解决方案的结构如图所示:

5.分离Infrastructure项目

分离Application项目后,由于Infrastructure只单向依赖Application中的接口,因此分离Infrastructure项目顺理成章。如果是多客户端项目,在分离Infrastructure后可以考虑再从Web项目中分离出单独表现逻辑层Example.WebBase。

(1)在解决方案中添加Example.Infrastructure项目。

(2)将Example项目中的Infrastructure文件夹下的全部文件迁移到Example.Infrastructure项目中,同样无需修改命名空间。

(3)修改项目的引用,添加Example对Example.Infrastructure项目的引用,添加Example.Infrastructure对Example.Application的引用。

此时解决方案结构如图所示:

6.添加Web服务支持

由于Web项目只依赖ApplicationService的接口,这是应有之意。我们添加服务层时只需要提供Web服务类型的IApplicationService接口实现即可。

(1)添加Example.Application.WebApi项目,引用Example.Application项目,封装ApplicationService应用服务。

(2)添加Example.WebApiApplicationService项目,引用Example.Application和Example.Application.WebApi项目,实现IApplicationService接口的WebApi版本WebApiApplicationService。

(3)修改Example项目的依赖注入配置,将IApplicationService的实现配置为WebApiApplicationService。

(4)还要记得将Web项目中配置的ApplicationService的第三方依赖接口的依赖注入配置转移到Web服务项目中。

此时解决方案如图所示:

7.Web服务器负载均衡的支持

添加Web服务器的负载均衡主要解决认证token的问题和Session的问题。

(1)ASP.NET的Forms认证可以通过修改Web.config支持生成同样的用户token。

(2)ASP.NET的Session可以通过自定义SessionStateStoreProviderBase实现分离Session到Session状态服务器或集群。

8.其他方面的扩展支持

无论是邮件服务、缓存还是数据库,Application都是通过接口隔离了具体的实现,因此我们可以按需添加ApplicationService中定义的IEmail、ICache、ILogger等的其他实现,再修改依赖注入的配置即可。如果没有采用Web服务,修改Web项目,否则修改Web服务项目的依赖注入配置。

架构系列:ASP.NET 项目结构搭建的更多相关文章

  1. NET 项目结构搭建

    NET 项目结构搭建 我们头开始,从简单的单项目解决方案,逐步添加业务逻辑的约束,从应用逻辑和领域逻辑两方面考虑,从简单的单个项目逐步搭建一个多项目的解决方案.主要内容:(1)搭建应用逻辑和领域逻辑都 ...

  2. SpringMVC+Spring+mybatis项目从零开始--分布式项目结构搭建

    转载出处: SpringMVC+Spring+mybatis+Redis项目从零开始--分布式项目结构搭建 /** 本文为博主原创文章,如转载请附链接. **/ SSM框架web项目从零开始--分布式 ...

  3. 使用.NET 6开发TodoList应用(2)——项目结构搭建

    为了不影响阅读的体验,我把系列导航放到文章最后了,有需要的小伙伴可以直接通过导航跳转到对应的文章 : P TodoList需求简介 首先明确一下我们即将开发的这个TodoList应用都需要完成什么功能 ...

  4. vue2项目结构搭建

    vue2项目结构初搭建与项目基本流程 一.开始项目结构搭建的重要性 决定项目是否能够健康成长 决定了项目是否利于多人协作开发 决定了项目是否利于后期维护 决定了项目是否性能良好 决定了代码是否重用率降 ...

  5. vue 快速入门 系列 —— Vue(自身) 项目结构

    其他章节请看: vue 快速入门 系列 Vue(自身) 项目结构 前面我们已经陆续研究了 vue 的核心原理:数据侦测.模板和虚拟 DOM,都是偏底层的.本篇将和大家一起来看一下 vue 自身这个项目 ...

  6. ABP架构学习系列一 整体项目结构及目录

    本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...

  7. MVC 实用构架实战(一)——项目结构搭建

    一.前言 在<上篇>中,已经把项目整体结构规划做了个大概的规划.在本文中,将使用代码的方式来一一解说各个层次.由于要搭建一个基本完整的结构,可能文章会比较长.另外,本系列主要出于实用的目的 ...

  8. Flask 系列之 优化项目结构

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 完善环境配置,添加 异常请求 处理 实现 400.404 ...

  9. vue2.0 仿手机新闻站(二)项目结构搭建 及 路由配置

    1.项目结构 $ vue init webpack-simple news $ npm install vuex vue-router axios style-loader css-loader -D ...

随机推荐

  1. 十五天精通WCF——终结篇 那些你需要注意的坑

    终于一路走来,到了本系列的最后一篇了,这一篇也没什么好说的,整体知识框架已经在前面的系列文章中讲完了,wcf的配置众多,如果 不加一些指定配置,你可能会遇到一些灾难性的后果,快来一睹为快吧. 一: 第 ...

  2. 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项 解决方法

    在webconfig中加入这段话就可以了 <runtime>    <assemblyBinding xmlns="urn:schemas-microsoft-com:as ...

  3. 烂泥:mysql数据库使用的基本命令

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 1.连接数据库的格式 mysql -h IP -u用户名 -p密码; 1.1连接远程数据库 mysql -h 192.168.1.214 -uroot ...

  4. iOS同一项目多个Target的快速实现方法

    之前写过这种场景下的项目,比如类似滴滴的司机端和乘客端,学生端和教师端等等.. 最近有人问我,就整理记录如下: 1.正常新建一个项目,完成后  如下: 2.这一步就是添加一个新的target 3.添加 ...

  5. linux cpu占有率居高不下 调试

    今天调试程序,使用top命令后,发现程序的cpu占有率很高,一直在99,这很可怕,所以来调试. 使用top命令,得如下结果 PID USER PR NI VIRT RES SHR S %CPU %ME ...

  6. Flex 布局教程:语法篇[转]

    网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...

  7. 今天有事-MySQL

    hi 今天有事,一会儿要去耍,能学多少是多少吧 1.MySQL -----子查询与连接(二)----- ----子查询 子查询,是指出现在其他SQL语句内的SELECT子句 注意:子查询指嵌套在查询内 ...

  8. 【CSS】使用CSS选择器

    CCS选择器的作用是找出某类元素.以便使我们使用style元素或者外部样式表对这类元素设置样式. 1.使用CSS基本选择器 有些选择器使用起来非常简单,我们把这部分选择器称为基本选择器(basic s ...

  9. HDU 2516 取石子游戏

    Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Secon ...

  10. Linux下监听或绑定(bind)843端口失败

    问题:写了一个程序,尝试在843端口监听,结果在执行bind的时候失败了 原来,系统不允许用户程序在1-1024端口监听,因为他们是知名端口. 解决办法: 换成root用户,即可成功bind.(ubu ...