Web层的搭建
2015-10-29 21:00
225 查看
Web层的搭建
前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码。之前的六篇完成了领域层、应用层、以及基础结构层的部分代码,这篇打算搭建下UI层的代码。DDD领域驱动设计初探系列文章:
C#进阶系列——DDD领域驱动设计初探(一):聚合
C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
C#进阶系列——DDD领域驱动设计初探(四):WCF搭建
C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用
C#进阶系列——DDD领域驱动设计初探(六):领域服务
C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
一、UI层介绍
在DDD里面,UI层的设计也分为BS和CS,本篇还是以Web为例来说明。我们的Web采用的是MVC+bootstrap的架构。Table组件使用的是bootstrap table,之所以用它是因为它的API比较全,并且博主觉得它的风格适用于各种类型的设备,无论是PC端还是手机端都都能很好的兼容各种浏览器。这里还是贴出bootstrap API的相关地址。
Bootstrap中文网:http://www.bootcss.com/
Bootstrap Table Demo:http://issues.wenzhixin.net.cn/bootstrap-table/index.html
Bootstrap Table API:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/
Bootstrap Table源码:https://github.com/wenzhixin/bootstrap-table
Bootstrap DataPicker:http://www.bootcss.com/p/bootstrap-datetimepicker/
Bootstrap离线API
二、代码示例
上篇完成了WCF的设计代码,但是具体的业务逻辑的代码还没有,我们先来实现具体业务的CURD代码。1、WCF代码
1.1 WCF服务业务接口代码
PowerManageWCFService这里要说明一点,在通过lamada表达式查询的方法里面为什么不直接用Expression<Func<DTO_TB_USERS,bool>>这种类型,而要使用ExpressionNode这种类型的变量呢?
这是因为Expression不支持序列化,无法用于WCF数据的传递。ExpressionNode这个对象的使用需要添加Serialize.Linq这个dll的引用,还好有我们神奇的NuGet,让我们再也不用去网上找一大堆的dll了。
BaseService
这个父类主要做了两件事:一是MEF的初始化;二是通用增删改查的实现。所有dto对象和领域model的映射都在这里统一管理。
2、UI层代码
UI层里面,为了更好分离代码,我们引入了接口编程的机制,引入了ESTM.Web.IBLL和ESTM.Web.BLL两个项目,如图:PowerManager : IPowerManager
PowerManagerController
View页面
_Layout.cshtml
Department.cshtml
JS代码我们来看一个页面就好了,其他页面类似:
DepartmentManage.js
效果图:
![](http://images2015.cnblogs.com/blog/459756/201510/459756-20151029152623841-1728467640.png)
![](http://images2015.cnblogs.com/blog/459756/201510/459756-20151029152632200-684376059.png)
![](http://images2015.cnblogs.com/blog/459756/201510/459756-20151029152720279-1898067262.png)
在做页面数据更新的时候,博主又遇到一个问题:ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。在此还是记录下解决方案:
在仓储的公共实现类中将
public virtual IQueryable<TEntity> Entities { get { return UnitOfWork.context.Set<TEntity>(); } }
改成
public virtual IQueryable<TEntity> Entities { get { return UnitOfWork.context.Set<TEntity>().AsNoTracking() as IQueryable<TEntity>; } }
就可以了。
至此,从领域模型到Web前端的代码基本完成,可能很多代码并未完善,比如异常处理、数据验证等。之前写过一篇CS版本的权限系统 系统设计——权限系统,很多朋友找我要过源码,那个时候可能代码都在工作的项目中,没办法抽离出来,在此表示抱歉。现在做了一个BS的,感觉BS比CS界面好看,在这里将源码分享出来,当然这里的代码肯定也不太全,很多没实现的功能还需要自己去实现,但是基本的架子搭起来了,有兴趣可以看看。源码下载
分类: .Net, BS, C#
相关文章推荐
- 安装linux系统之RHEL7或CENTOS7系统(完整版)
- BZOJ 3123 [Sdoi2013]森林 主席树+启发式合并
- 解决java compiler level does not match the version of the installed java project facet
- hdu4883
- CUDA学习2015.10.29
- java基础之static关键字(1)
- 解决java compiler level does not match the version of the installed java project facet
- UItableBarController
- mysql乱码解决
- JavaMelody应用监控使用指南
- 字符串对比
- 3-8译码器-20151028
- Linux HA (一)
- c语言中认识指针
- 第七周 项目6 停车场模拟
- 记录利用ettercap进行简单的arp欺骗和mitm攻击过程
- AddressBookUI
- 数位DP-HDU-3555-Bomb
- hdu--3790
- java IO 字节编码