天天看点

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码。之前的六篇完成了领域层、应用层、以及基础结构层的部分代码,这篇打算搭建下UI层的代码。

DDD领域驱动设计初探系列文章:

<a href="http://www.cnblogs.com/landeanfen/p/4816706.html">C#进阶系列——DDD领域驱动设计初探(一):聚合</a>

<a href="http://www.cnblogs.com/landeanfen/p/4834730.html">C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)</a>

<a href="http://www.cnblogs.com/landeanfen/p/4837520.html">C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)</a>

<a href="http://www.cnblogs.com/landeanfen/p/4841211.html">C#进阶系列——DDD领域驱动设计初探(四):WCF搭建</a>

<a href="http://www.cnblogs.com/landeanfen/p/4842015.html">C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用</a>

<a href="http://www.cnblogs.com/landeanfen/p/4844344.html" target="_blank">C#进阶系列——DDD领域驱动设计初探(六):领域服务</a>

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

在DDD里面,UI层的设计也分为BS和CS,本篇还是以Web为例来说明。我们的Web采用的是MVC+bootstrap的架构。Table组件使用的是bootstrap table,之所以用它是因为它的API比较全,并且博主觉得它的风格适用于各种类型的设备,无论是PC端还是手机端都都能很好的兼容各种浏览器。

这里还是贴出bootstrap API的相关地址。

<a href="http://pan.baidu.com/s/1kTERYsf" target="_blank">Bootstrap离线API</a>

上篇完成了WCF的设计代码,但是具体的业务逻辑的代码还没有,我们先来实现具体业务的CURD代码。

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

PowerManageWCFService

这里要说明一点,在通过lamada表达式查询的方法里面为什么不直接用Expression&lt;Func&lt;DTO_TB_USERS,bool&gt;&gt;这种类型,而要使用ExpressionNode这种类型的变量呢?

这是因为Expression不支持序列化,无法用于WCF数据的传递。ExpressionNode这个对象的使用需要添加Serialize.Linq这个dll的引用,还好有我们神奇的NuGet,让我们再也不用去网上找一大堆的dll了。

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

我们公用的增删改查封装到了BaseService这个父类里面。

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

BaseService

这个父类主要做了两件事:一是MEF的初始化;二是通用增删改查的实现。所有dto对象和领域model的映射都在这里统一管理。

UI层里面,为了更好分离代码,我们引入了接口编程的机制,引入了ESTM.Web.IBLL和ESTM.Web.BLL两个项目,如图:

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

这个dll主要定义接口规则。

这个dll用于实现ESTM.Web.IBLL里面的接口方法

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

PowerManager : IPowerManager

 由于是采用的添加服务引用的方式引用的WCF服务,所以在这一层需要添加WCF服务的引用。在实现这部分代码的时候博主遇到过一个问题,在此和朋友们分享一下。由于在WCF服务的设计里面用到了DTO对象,而在ESTM.Web.BLL这个项目里面也要用到DTO,但是添加WCF服务引用的时候默认的是WCF服务里面的DTO,而不是ESTM.Common.DtoModel这个项目的DTO对象,这样就有问题了,每次如果我们需要改动下dto的内容,那么我们就需要更新下服务引用。还好,微软给我们选择的机制,我们来看图

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

这样就能解决上面的问题了。

按照面向接口的机制,ESTM.Web项目是不需要添加ESTM.Web.BLL这个实现层项目引用的,通过MEF动态导入ESTM.Web.BLL里面的对象。我们来看代码:

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

PowerManagerController

View页面

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

_Layout.cshtml

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

Department.cshtml

JS代码我们来看一个页面就好了,其他页面类似:

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

DepartmentManage.js

效果图:

C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建

在做页面数据更新的时候,博主又遇到一个问题:ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。在此还是记录下解决方案:

在仓储的公共实现类中将

改成

就可以了。

继续阅读