开始学习的时候,搭建底层架构非常吃力。听着师哥师姐讲架构,感觉像听天书的似的,脑子里面一团浆糊,就看着师哥的F12按的特别欢,具体跳到哪里了,不知道。
不过硬着头皮做了一段时间的项目后,因为要如果不分析里面的调用关系,根本就不知道一条线怎么下来,所以一开始模仿,渐渐地开始有了自己的思路,感觉整个框架在脑海里面越来越清晰。
.Net的框架十分的强大,跟之前的机房收费系统比,真的是从原始社会直接奔向了小康社会。
废话不多说的,赶紧进入正题,整个框架主要分成以下这几块,简单的介绍一下它的调用关系:
客户端:MVC框架,View层主要负责界面显示,里面的控件主要采用EasyUI,少量不可修改的属性也可以手写JS来修改样式,是门面;Controller里面主要调用WCF里面的方法,也可以配置View层的动态表头信息等;Model层这里其实不是我们说的底层类库,与之对应的是WCF层里面的数据契约,数据契约与页面上显示的控件信息相对应,不一定是跟实体里面的字段一致。
WCF:主要是沟通客户端和服务端。创建WCFService具体类的时候,会与之产生一个对应的接口,我们把它删掉,在ServiceContracts里面重新创建一个与具体类对应的接口。这样做的目的是考虑到多个接口发布的效率会不如发布一个接口的效率。
服务端:BLL/DAL层都是采用的传统的抽象工厂创建接口来实现具体类,使界面和BLL、DAL解耦,提高了系统的灵活性。BLL/DAL之间存在DbSession,BLL调用Dbsession的工厂创建与之对应的接口,这个接口具体实现是调用DAL层的工厂创建DAL层的接口,实现DAL层类。这绕一下,目的是保证线程的唯一。BLL/DAL的接口都有三种:ICoreService/IBaseService/IUserInfoService,这三种依次是底层类库的接口、各系统服务总接口、各个系统具体的接口。通过部分接口和部分类,来实现多个类、接口实现统一的接口,然后进行发布。
回眸一笑百媚生,重点要回顾。
2015年12月4日
今天给同事们讲框架,心情很激动,准备这个用了差不多3个小时左右的时间,感觉自己紧张了一下,但是讲的还算很尽兴的。
整个框架主要分成两部分:客户端、服务端。
客户端主要用来对外发布页面,服务端主要为客户端提供逻辑和数据。客户端配置文件,主要是WCF配置:包含服务端的发布终结点,和其他系统WCF发布终结点。服务端的配置文件,主要包括B/D/DbSession的IOC容器配置,及属性的注入。
IOC(Inverse of Control)控制反转,控制反转是一种将组件的依赖关系的创建和管理置于程序外部的技术,由容器控制程序之间的关系,而不是由代码直接控制,控制权从代码转向了容器,所以称为反转。
一个需要特定的依赖的组件一般会涉及一个依赖对象,在IOC的概念叫做目标(target)。IOC提供了这样的服务,使一个组件能够在它的整个生命周期中访问它的依赖和服务,用这种方法与它的依赖进行交互。
包括依赖查找,依赖注入,在代码中都有体现。
什么是依赖查找呢?
查找dbSession,从缓存中获得数据库上下文信息,从SpringHelper处获得DbSession的依赖关系。
public override void SetDbSession() { //从缓存中取出上下文信息 ICoreDbSession dbSession = CallContext.GetData("DbSession") as ICoreDbSession; if (dbSession == null) { //从缓存中拿到这个信息,<span style="font-family:KaiTi_GB2312;">依赖查找</span> dbSession = SpringHelper.GetObject<ICoreDbSession>("DBSession"); //TODO:DbContext,线程内缓存,不适用于集群,后期分布式缓存进行处理,key为guid CallContext.SetData("DbSession", dbSession); } this.MyBasedbSession = dbSession; this.DbSession = (IDbSession)this.MyBasedbSession; }
web.config进行依赖注入,两个对象间的依赖关系在程序运行时由外部容器动态的注入依赖行为方式称为依赖注入(DI).
<objects xmlns="http://www.springframework.net"> <object id="entitys" type="ITOO.BasicChooseManager.Model.Entities,ITOO.BasicChooseManager.Model" singleton="false" /> <!--DbSession层的的注解--> <object id="DBSession" type="ITOO.BasicChooseManager.DAL.DbSession,ITOO.BasicChooseManager.DAL" singleton="false"> <!--加入属性注入,指向D层的注入--> <property name="ChoseCourseCourseDal" ref="ChoseCourseCourseDal" /> <!--<property name="ChoseCouseDal" ref="ChoseCouseDal" />--> <property name="ChoseCouseRoundDal" ref="ChoseCouseRoundDal" /> <!--<property name="ChoseCourseRoundCollegeDal" ref="ChoseCourseRoundCollegeDal" />--> <property name="ChoseCourseRoundCourseDal" ref="ChoseCourseRoundCourseDal" /> <!--<property name="ChoseCourseRoundGradeDal" ref="ChoseCourseRoundGradeDal" /> <property name="ChoseCourseRoundLevelsDal" ref="ChoseCourseRoundLevelsDal" />--> <property name="CalendarDal" ref="CalendarDal" /> <property name="RoundGradeCollegeDal" ref="RoundGradeCollegeDal" /> <property name="CreateCourseDal" ref="CreateCourseDal" /> <property name="CourseCollegeTreeDal" ref="CourseCollegeTreeDal"/> <property name="CouldChooseCourseDal" ref="CouldChooseCourseDal"/> <property name="OnClassStudentDal" ref="OnClassStudentDal"/> <property name="ChoosedCourseDal" ref="ChoosedCourseDal"/> <property name="StudentDal" ref="StudentDal"/> <property name="GradeLevelDal" ref="GradeLevelDal"></property> <property name="CourseRoundGradeCollegesDal" ref="CourseRoundGradeCollegesDal"></property> </object> <!--D层的的注解--> <object id="ChoseCourseCourseDal" type="ITOO.BasicChooseManager.DAL.ChoseCourseCourseDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="ChoseCouseRoundDal" type="ITOO.BasicChooseManager.DAL.ChoseCouseRoundDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="ChoseCourseRoundCourseDal" type="ITOO.BasicChooseManager.DAL.ChoseCourseRoundCourseDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="CalendarDal" type="ITOO.BasicChooseManager.DAL.CalendarDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="RoundGradeCollegeDal" type="ITOO.BasicChooseManager.DAL.RoundGradeCollegeDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="CreateCourseDal" type="ITOO.BasicChooseManager.DAL.CreateCourseDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="CourseCollegeTreeDal" type="ITOO.BasicChooseManager.DAL.CourseCollegeTreeDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="CouldChooseCourseDal" type="ITOO.BasicChooseManager.DAL.CouldChooseCourseDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="OnClassStudentDal" type="ITOO.BasicChooseManager.DAL.OnClassStudentDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="ChoosedCourseDal" type="ITOO.BasicChooseManager.DAL.ChoosedCourseDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="StudentDal" type="ITOO.BasicChooseManager.DAL.StudentDal,ITOO.BasicChooseManager.DAL" singleton="false" /> <object id="GradeLevelDal" type="ITOO.BasicChooseManager.DAL.GradeLevelDal,ITOO.BasicChooseManager.DAL" singleton="false"></object> <object id="CourseRoundGradeCollegesDal" type="ITOO.BasicChooseManager.DAL.CourseRoundGradeCollegesDal,ITOO.BasicChooseManager.DAL" singleton="false" ></object> <!--D层的的注解--> <!--B层的的注解--> <object id="CalendarBll" type="ITOO.BasicChooseManager.BLL.CalendarBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="CreateCourseBll" type="ITOO.BasicChooseManager.BLL.CreateCourseBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="CourseBll" type="ITOO.BasicChooseManager.BLL.CourseBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="RoundBll" type="ITOO.BasicChooseManager.BLL.RoundBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="RoundCourseBll" type="ITOO.BasicChooseManager.BLL.RoundCourseBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="GetServiceBll" type="ITOO.BasicChooseManager.BLL.GetServiceBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="RoundGradeCollegeBll" type="ITOO.BasicChooseManager.BLL.RoundGradeCollegeBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="CourseCollegeTreeBll" type="ITOO.BasicChooseManager.BLL.CourseCollegeTreeBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="CouldChooseCourseBll" type="ITOO.BasicChooseManager.BLL.CouldChooseCourseBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="ChoosedCourseBll" type="ITOO.BasicChooseManager.BLL.ChoosedCourseBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="GradeLevelBll" type="ITOO.BasicChooseManager.BLL.GradeLevelBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <object id="CourseRoundGradeCollegesBll" type="ITOO.BasicChooseManager.BLL.CourseRoundGradeCollegesBll,ITOO.BasicChooseManager.BLL" singleton="false" /> <!--B层的的注解--> </objects>
IOC的优点是,让实例化变的更加简单,代码简洁,可配置,是通过工厂创建接口,获得具体实现类的升级版。
也可以分成三部分MVC,View-Controller-Model(WCF+B+D+EF)。
View主要负责前台页面的显示,
Controller从视图读取数据,控制用户输入,并向模型发送数据,
Model就是WCF以及往下的所有的代码,主要用来处理程序数据逻辑部分。
架构主要通过工厂.接口,来获得WCF的实例;或者通过IOC容器,创建B/D/DbSession的实例。B继承BaseService,所以每个B继承DbSession,这样B就通过IOC,类型为IDbSession,获取DbSession的实例;同理,再通过IOC获得DbSession获得DAL的实例。
ViewModel是页面实体,Model是数据实体。页面实体对应页面字段,数据实体对应数据库实体。