MVC项目结构构建和单类实现研究注1
新人刚开始在ASP.NET学MVC。如果有什么缺点,希望得到你的建议。我很感激!
让我们从项目:的层次结构图开始
模型:模型层,主要包括各种类型、枚举和ORM框架,完成数据库和实体类之间的映射。项目选择了微软开源ORM框架EntityFramework 6.0(以下简称EF)和微软轻量级数据库SQL Server Compact 4.0本地数据库(以下简称Compact)。Compact完美支持ef,是一个基于文档的数据库,部署简单。
DAL:数据访问层,主要是数据库的操作层,为业务逻辑层或表示层提供数据服务。
IDAL:数据访问接口层,是数据访问层的接口,减少耦合。
DALFactory:数据会话层,封装所有数据操作类实例的创建,并将数据访问层与业务逻辑层解耦。
BLL:业务逻辑层,主要负责数据层的操作,结合一些数据层的操作来满足业务的需求。
IBLL:业务逻辑接口层,业务逻辑层的接口,减少耦合。
WebApp:表示层,是ASP.NET的一个MVC项目,完成具体网站的实现。
公共:公共层用于存储一些工具类。
以下是各级的具体实施情况。首先,创建以项目名称命名的所有级别。级别名称。除了WebApp层是ASP.NET MVC项目之外,其他都是作为类库项目创建的。
模型层的构建
首先,建立模型层,创建一个新的ASP.NET实体数据模型,并将其与设计的数据库相关联。EF自动完成模型类的创建。
数据访问层的构建
在DAL层,我们首先需要一种方法来获取EF数据操作上下文对象的单个实例,从而保证每个用户在访问时只使用一个上下文对象来操作数据库。
DbContextFactory.cs
使用系统。数据.实体;使用系统。运行时。远程处理。消息传递;使用经前综合症。模型;namespace PMS . dal { public class db context factory {///summary///负责创建EF数据操作上下文的实例。线程内必须保证唯一的////summary公共静态db context create context(){ db context db context=(db context)call context . getdata(' db context ');if (dbContext!=null)返回dbContextdb context=new PMS entities();CallContext。SetData('dbContext ',dbContext);返回dbContext}}}为User类创建DAL层,实现查询、分页查询、添加、删除、修改五种基本方法:
UserDAL.cs
使用系统;使用系统。数据。实体;使用系统Linq .使用经前综合症IDAL;命名空间经前综合症.公共的分部类UserDal { public DBcontext DBentities=DBContextFactory .创建上下文();///摘要///查询过滤////summary////param name=' where lamada '过滤条件希腊字母的第11个表达式/param /返回实体集合/返回公共IQueryableUserDal加载实体(系统.linq。表情。表达式unkuncserdal,bool其中lamada){返回db实体.SetUserDal().哪里(哪里喇嘛达);} ///摘要///分页查询////summary///type param name=' TS '排序类型/type param///param name=' PageIndex '查询的页码/param ///param name='pageSize '每页显示的数目/param ///param name='totalCount '符合条件的总行数/param///param name='其中lambda '过滤条件希腊字母的第11个表达式/param///param name=' orderbyLambda '排序希腊字母的第11个表达式/param ///param name='isAsc '排序方向/param /返回实体集合/返回公共IQueryableUserDal loadpageentities(int page index,int pageSize,out int totalCount,System .linq。表情。表达式unkuncserdal,bool whereLambda,System .linq。表情。表达式unkuncserdal,TS orderbyLambda,bool isAsc) { var temp=DbEntities .SetUserDal().其中(其中);totalCount=temp .count();temp=isAsc?在…之时OrderBy(orderbyLambda).跳过((页面索引- 1) *页面大小)。取(页面大小):的温度OrderByDescending(orderbyambda).跳过((页面索引- 1) *页面大小)。take(PageSize);返回温度;} ///摘要///删除数据////summary///param name=' entity '待删数据/param /返回删除结果/返回公共布尔删除实体(用户数据实体){ DbEntities .条目(实体)。状态=实体状态。已删除;返回真;} ///摘要///编辑数据////summary///param name=' entity '待编辑数据/param /返回编辑结果/返回公共布尔编辑实体(用户数据实体){ DbEntities .条目(实体)。状态=实体状态。已修改;返回真;} ///摘要///添加数据////summary///param name=' entity '待添加数据/param /返回已添加数据/返回公共用户数据实体(用户数据实体){实体=数据库实体SetUserDal().添加(实体);返回实体;} }}注:这里的增删改操作并不即时进行,而是在封装在数据会话层中,以实现工作单元模式,提高数据库的操作效率。
考虑到每个类都需要实现相同的数据操作,我们可以将以上方法封装到一个泛型基类中,各类型只需要继承泛型基类就可以实现以上方法:
BaseDal.cs
使用系统;使用系统。数据。实体;使用系统Linq .命名空间经前综合症.公共类其中T:class,new(){公共数据库上下文数据库实体=数据库上下文工厂.创建上下文();///摘要///查询过滤////summary////param name=' where lamada '过滤条件希腊字母的第11个表达式/param /返回实体集合/返回公共IQueryableT加载实体(系统.linq。表情。表达式funct,bool其中lamada){返回db实体.SetT().哪里(哪里喇嘛达);} ///摘要///分页查询////summary///type param name=' TS '排序类型/type param///param name=' PageIndex '查询的页码/param ///param name='pageSize '每页显示的数目/param ///param name='totalCount '符合条件的总行数/param///param name='其中lambda '过滤条件希腊字母的第11个表达式/param///param name=' orderbyLambda '排序希腊字母的第11个表达式/param ///param name='isAsc '排序方向/param /返回实体集合/返回公共IQueryableT loadpageentities(页间索引,页间大小,页间总数,系统.表达式,表达式,布尔函数,系统linq。表情。表达式函数,TS orderbyLambda,bool isAsc) { var temp=DbEntities .SetT().其中(其中);totalCount=temp .count();temp=isAsc?在…之时OrderBy(orderbyLambda).跳过((页面索引- 1) *页面大小)。取(页面大小):的温度OrderByDescending(orderbyambda).跳过((页面索引- 1) *页面大小)。take(PageSize);返回温度;} ///摘要///删除数据////summary///param name=' entity '待删数据/param /返回删除结果/返回公共布尔删除实体(T实体){ DbEntities .条目(实体)。状态=实体状态。已删除;返回真;} ///摘要///编辑数据////summary///param name=' entity '待编辑数据/param /返回编辑结果/返回公共布尔编辑实体实体){ DbEntities .条目(实体)。状态=实体状态。已修改;返回真;} ///摘要///添加数据////summary///param name=' entity '待添加数据/param /返回已添加数据/返回公共添加实体实体){ entity=DbEntities .SetT().添加(实体);//DbEntities .saveChanges();返回实体;} }}UserDal继承BaseDal
使用经前综合症IDAL;使用经前综合症。模型;命名空间经前综合症.DAL{公共分部类UserDal : BaseDalUser } }数据访问接口层的构建
然后我们建立相应的IbaseDal接口和IUserDal接口,并且使用户数据类实现IUserDal接口
IBaseDal:
使用系统;使用系统Linq .命名空间经前综合症.IDAL公共接口IBaseDalT,其中T:class,new(){ IQueryableT LoadEntities(System .linq。表情。表达式funct,bool其中lamada);IQueryableT loadpageentities(页间索引,页间大小,页间总数,系统.表达式,表达式,布尔函数,系统linq。表情。表达式funct,s orderbyLambda,bool isAsc);布尔删除实体(T实体);布尔编辑实体(T实体);添加实体实体);}}IUserDal:
使用经前综合症。模型;命名空间经前综合症.IDAL公共部分接口iuserdal : ibasedaluser } { Userdal }实现IUserDal接口:
公共分部类UserDal : BaseDalUser,IUserDal
数据会话层的构建
抽象工厂类抽象工厂:
使用系统。配置;使用系统。反思;使用经前综合症IDAL;命名空间经前综合症.DALFactory{公共分部类抽象工厂{ //读取保存在配置文件中的程序集名称与命名空间名私有静态只读字符串装配路径=配置管理器.AppSettings['程序集路径'];私有静态只读字符串名称空间=配置管理器.AppSettings[' NameSpace '];///摘要///获取用户数据的实例////summary///returns/returns public static IUserDal CreateUserInfoDal(){ var完整类名=NameSpace ' .用户info dal ';将创建实例(完整类名)作为IUserDal返回;} ///摘要///通过反射获得程序集中某类型的实例////summary////param name=' class name '/param////返回/返回私有静态对象创建实例(字符串类名){ var Assembly=Assembly .加载(装配路径);返回组件CreateInstance(类名);} }}数据会话类数据库会话:
使用系统。数据。实体;使用经前综合症IDAL;使用经前综合症DAL .命名空间经前综合症.dal工厂{公共分部类dbsession : IDB会话{公共DbContext Db { get } {返回DbContext工厂.创建上下文();} } private IUserDal _ UserDal public IUserDal UserDal { get { return _ UserDal?(_userDal=抽象工厂. CreateUserInfoDal());}设置{ _userDal=值;} } ///摘要///工作单元模式,统一保存数据////summary////returns/returns public bool saveChanges(){ return Db .保存更改(0);} }}业务逻辑层的构建
业务类基类BaseService
使用系统;使用系统Linq .使用系统Linq。表达式;使用经前综合症戴尔工厂.使用经前综合症IDAL;命名空间经前综合症.BLL公共抽象类BaseServiceT,其中T:class,new(){ public IDB session current b session { get { return new db session();} } public IBaseDalT CurrentDal { get;设置;}公共抽象void SetCurrentDal();public BaseServiCe(){ SetCurrentDal();//子类一定要实现抽象方法,以指明当前类的子类类型} ///摘要//查询过滤////summary////param name='其中lambda '/param////returns/returns public IQueryableT LoadEntities(表达式onfunt,bool其中lambda){ return current dal .加载实体(其中);} ///摘要///分页////summary///type param name=' s '/type param///param name=' page index '/param///param name=' page size '/param///param name=' total count '/param///param name='其中lambda '/param///param name=' orderbyLambda '/param///param name=' isAsc '/param///returns/returns public IQueryableT loadpageentities(int page index,int pageSize,out int totalCount,load} ///摘要///删除////summary////param name=' entity '/param////returns/returns public bool delete entity(T实体){ CurrentDal .删除实体(实体);返回当前会话saveChanges();} ///摘要///编辑////summary////param name=' entity '/param////returns/returns public bool EditEntity(T实体){ CurrentDal .编辑实体(实体);返回当前会话saveChanges();} ///摘要///添加数据////summary////param name=' entity '/param////returns/returns public T AddEntity(T entity){ current dal .添加实体(实体);当前会话saveChanges();返回实体;} }}UserService类:
使用经前综合症IBLL .使用经前综合症。模型;命名空间经前综合症.BLL公共分部类用户服务:基本服务用户{公共重写void SetCurrentDal(){ CurrentDal=current session .UserDal} }}业务逻辑接口层的构建
直接建立对应的接口并使用UserService类实现IUserService接口
IBaseService接口:
使用系统;使用系统Linq .使用系统Linq。表达式;使用经前综合症IDAL;命名空间经前综合症.IBLL{公共接口IBaseServiceT,其中T :类,new(){ IDbSession current session { get;} IBaseDalT CurrentDal { get设置;} void SetCurrentDal();IQueryableT LoadEntities(表达式funct,bool其中lambda);IQueryableT LoadPageEntitiess(int page index,int pageSize,out int totalCount,表达式on fock,bool whereLambda,表达式on fock,s orderbyLambda,bool isAsc);布尔删除实体(T实体);布尔编辑实体(T实体);添加实体实体);}}IUserService接口:
使用经前综合症。模型;命名空间经前综合症.IBLL{公共部分接口iuserservice: ibaseserviceuser } }使用UserService类实现IUserService接口:
公共分部类用户服务: BaseServiceUser,IUserService
以上我们就完成了整个框架中关于用户类的各层次的实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
版权声明:MVC项目结构构建和单类实现研究注1是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。