石家庄外贸网站建设,深圳公司注册材料,襄阳集团网站建设,北京网站设计首选 新鸿儒新人刚开始学习ASP.NET MVC#xff0c;若有不足之处希望能得到您的指点#xff0c;不胜感激#xff01; 先来一张项目的层级结构图: Model#xff1a;模型层#xff0c;主要是各种类型、枚举以及ORM框架#xff0c;框架完成数据库和实体类的映射。项目中选用了微软的开源… 新人刚开始学习ASP.NET MVC若有不足之处希望能得到您的指点不胜感激 先来一张项目的层级结构图: Model模型层主要是各种类型、枚举以及ORM框架框架完成数据库和实体类的映射。项目中选用了微软的开源ORM框架 EntityFramework 6.0 以下简称EF数据库则选择了微软的轻量级数据库SQL Server Compact 4.0本地数据库简称CompactCompact对EF支持比较完美又属于文档型数据库部署起来比较简洁。 DAL数据访问层主要是对数据库的操作层为业务逻辑层或表示层提供数据服务。 IDAL数据访问接口层是数据访问层的接口降低耦合。 DALFactory数据会话层封装了所有数据操作类实例的创建将数据访问层与业务逻辑层解耦。 BLL业务逻辑层主要负责对数据层的操作把一些数据层的操作进行组合以完成业务的需要。 IBLL业务逻辑接口层业务逻辑层的接口降低耦合。 WebApp表现层是一个ASP.NET MVC项目完成具体网站的实现。 Common通用层用来存放一些工具类。 下面是各个层级之间具体的实现首先创建以 项目名.层级名 命名的各个层次除WebApp层为ASP.NET MVC项目外其余均创建为类库项目。 模型层的构建 先建立模型层新建ASP.NET 实体数据模型关联到已经设计好的数据库EF自动完成模型类的创建。 数据访问层的构建 DAL层中我们首先需要一个方法来获取单例的EF数据操纵上下文对象以保证每个用户访问时只有使用一个上下文对象对数据库进行操作。DbContextFactory.cs using System.Data.Entity;
using System.Runtime.Remoting.Messaging;
using PMS.Model;namespace PMS.DAL
{public class DbContextFactory{/// summary/// 负责创建EF数据操作上下文实例,必须保证线程内唯一/// /summarypublic static DbContext CreateContext(){DbContext dbContext (DbContext)CallContext.GetData(dbContext);if (dbContext ! null) return dbContext;dbContext new PMSEntities();CallContext.SetData(dbContext, dbContext);return dbContext;}}
} 为User类创建DAL层实现查询、分页查询、增加、删除和修改这五个基本的方法UserDAL.cs using System;
using System.Data.Entity;
using System.Linq;
using PMS.IDAL;namespace PMS.DAL
{public partial class UserDal {public DbContext DbEntities DbContextFactory.CreateContext();/// summary/// 查询过滤/// /summary/// param namewhereLamada过滤条件Lambda表达式/param/// returns实体集合/returnspublic IQueryableUserDal LoadEntities(System.Linq.Expressions.ExpressionFuncUserDal, bool whereLamada){return DbEntities.SetUserDal().Where(whereLamada);}/// summary/// 分页查询/// /summary/// typeparam nameTS排序类型/typeparam/// param namepageIndex查询的页码/param/// param namepageSize每页显示的数目/param/// param nametotalCount符合条件的总行数/param/// param namewhereLambda过滤条件Lambda表达式/param/// param nameorderbyLambda排序Lambda表达式/param/// param nameisAsc排序方向/param/// returns实体集合/returnspublic IQueryableUserDal LoadPageEntitiesTS(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.ExpressionFuncUserDal, bool whereLambda, System.Linq.Expressions.ExpressionFuncUserDal, TS orderbyLambda, bool isAsc){var temp DbEntities.SetUserDal().Where(whereLambda);totalCount temp.Count();temp isAsc ? temp.OrderBy(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize) : temp.OrderByDescending(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);return temp;}/// summary/// 删除数据/// /summary/// param nameentity待删数据/param/// returns删除结果/returnspublic bool DeleteEntity(UserDal entity){DbEntities.Entry(entity).State EntityState.Deleted;return true;}/// summary/// 编辑数据/// /summary/// param nameentity待编辑数据/param/// returns编辑结果/returnspublic bool EditEntity(UserDal entity){DbEntities.Entry(entity).State EntityState.Modified;return true;}/// summary/// 添加数据/// /summary/// param nameentity待添加数据/param/// returns已添加数据/returnspublic UserDal AddEntity(UserDal entity){entity DbEntities.SetUserDal().Add(entity);return entity;} }
} 注这里的增删改操作并不即时进行而是在封装在数据会话层中以实现工作单元模式提高数据库的操作效率。 考虑到每个类都需要实现相同的数据操作我们可以将以上方法封装到一个泛型基类中各类型只需要继承泛型基类就可以实现以上方法BaseDal.cs using System;
using System.Data.Entity;
using System.Linq;namespace PMS.DAL
{public class BaseDalT where T:class ,new(){public DbContext DbEntities DbContextFactory.CreateContext();/// summary/// 查询过滤/// /summary/// param namewhereLamada过滤条件Lambda表达式/param/// returns实体集合/returnspublic IQueryableT LoadEntities(System.Linq.Expressions.ExpressionFuncT, bool whereLamada){return DbEntities.SetT().Where(whereLamada);}/// summary/// 分页查询/// /summary/// typeparam nameTS排序类型/typeparam/// param namepageIndex查询的页码/param/// param namepageSize每页显示的数目/param/// param nametotalCount符合条件的总行数/param/// param namewhereLambda过滤条件Lambda表达式/param/// param nameorderbyLambda排序Lambda表达式/param/// param nameisAsc排序方向/param/// returns实体集合/returnspublic IQueryableT LoadPageEntitiesTS(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.ExpressionFuncT, bool whereLambda, System.Linq.Expressions.ExpressionFuncT, TS orderbyLambda, bool isAsc){var temp DbEntities.SetT().Where(whereLambda);totalCount temp.Count();temp isAsc ? temp.OrderBy(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize) : temp.OrderByDescending(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);return temp;}/// summary/// 删除数据/// /summary/// param nameentity待删数据/param/// returns删除结果/returnspublic bool DeleteEntity(T entity){DbEntities.Entry(entity).State EntityState.Deleted;return true;}/// summary/// 编辑数据/// /summary/// param nameentity待编辑数据/param/// returns编辑结果/returnspublic bool EditEntity(T entity){DbEntities.Entry(entity).State EntityState.Modified;return true;}/// summary/// 添加数据/// /summary/// param nameentity待添加数据/param/// returns已添加数据/returnspublic T AddEntity(T entity){entity DbEntities.SetT().Add(entity);//DbEntities.SaveChanges();return entity;}}
} UserDal继承BaseDal using PMS.IDAL;
using PMS.Model;namespace PMS.DAL
{public partial class UserDal : BaseDalUser{}
} 数据访问接口层的构建 然后我们建立相应的IbaseDal接口和IUserDal接口并且使UserDal类实现IUserDal接口 IBaseDal using System;
using System.Linq;namespace PMS.IDAL
{public interface IBaseDalT where T:class,new(){IQueryableT LoadEntities(System.Linq.Expressions.ExpressionFuncT, bool whereLamada);IQueryableT LoadPageEntitiess(int pageIndex, int pageSize, out int totalCount,System.Linq.Expressions.ExpressionFuncT, bool whereLambda,System.Linq.Expressions.ExpressionFuncT, s orderbyLambda, bool isAsc);bool DeleteEntity(T entity);bool EditEntity(T entity);T AddEntity(T entity);}
} IUserDal using PMS.Model;namespace PMS.IDAL
{public partial interface IUserDal:IBaseDalUser{}
} UserDal实现IUserDal接口 public partial class UserDal : BaseDalUser,IUserDal 数据会话层的构建 抽象工厂类AbstractFactory using System.Configuration;
using System.Reflection;
using PMS.IDAL;namespace PMS.DALFactory
{public partial class AbstractFactory{//读取保存在配置文件中的程序集名称与命名空间名private static readonly string AssemblyPath ConfigurationManager.AppSettings[AssemblyPath];private static readonly string NameSpace ConfigurationManager.AppSettings[NameSpace];/// summary/// 获取UserDal的实例/// /summary/// returns/returnspublic static IUserDal CreateUserInfoDal(){var fullClassName NameSpace .UserInfoDal;return CreateInstance(fullClassName) as IUserDal;}/// summary/// 通过反射获得程序集中某类型的实例/// /summary/// param nameclassName/param/// returns/returnsprivate static object CreateInstance(string className){var assembly Assembly.Load(AssemblyPath);return assembly.CreateInstance(className);}}
} 数据会话类DbSession using System.Data.Entity;
using PMS.IDAL;
using PMS.DAL;namespace PMS.DALFactory
{public partial class DbSession:IDbSession{public DbContext Db{get { return DbContextFactory.CreateContext(); }}private IUserDal _userDal;public IUserDal UserDal{get { return _userDal ?? (_userDal AbstractFactory.CreateUserInfoDal()); }set { _userDal value; }}/// summary/// 工作单元模式统一保存数据/// /summary/// returns/returnspublic bool SaveChanges(){return Db.SaveChanges() 0;}}
} 业务逻辑层的构建 业务类基类BaseService using System;
using System.Linq;
using System.Linq.Expressions;
using PMS.DALFactory;
using PMS.IDAL;namespace PMS.BLL
{public abstract class BaseServiceT where T:class,new(){public IDbSession CurrentDbSession{get{return new DbSession();}}public IBaseDalT CurrentDal { get; set; }public abstract void SetCurrentDal();public BaseService(){SetCurrentDal();//子类一定要实现抽象方法以指明当前类的子类类型。}/// summary/// 查询过滤/// /summary/// param namewhereLambda/param/// returns/returnspublic IQueryableT LoadEntities(ExpressionFuncT, bool whereLambda){return CurrentDal.LoadEntities(whereLambda);}/// summary/// 分页/// /summary/// typeparam names/typeparam/// param namepageIndex/param/// param namepageSize/param/// param nametotalCount/param/// param namewhereLambda/param/// param nameorderbyLambda/param/// param nameisAsc/param/// returns/returnspublic IQueryableT LoadPageEntitiess(int pageIndex, int pageSize, out int totalCount, ExpressionFuncT, bool whereLambda,ExpressionFuncT, s orderbyLambda, bool isAsc){return CurrentDal.LoadPageEntitiess(pageIndex, pageSize, out totalCount, whereLambda, orderbyLambda, isAsc);}/// summary/// 删除/// /summary/// param nameentity/param/// returns/returnspublic bool DeleteEntity(T entity){CurrentDal.DeleteEntity(entity);return CurrentDbSession.SaveChanges();}/// summary/// 编辑/// /summary/// param nameentity/param/// returns/returnspublic bool EditEntity(T entity){CurrentDal.EditEntity(entity);return CurrentDbSession.SaveChanges();}/// summary/// 添加数据/// /summary/// param nameentity/param/// returns/returnspublic T AddEntity(T entity){CurrentDal.AddEntity(entity);CurrentDbSession.SaveChanges();return entity;}}
} UserService类 using PMS.IBLL;
using PMS.Model;namespace PMS.BLL
{public partial class UserService : BaseServiceUser{public override void SetCurrentDal(){CurrentDal CurrentDbSession.UserDal;}}
} 业务逻辑接口层的构建 直接建立对应的接口并使用UserService类实现IUserService接口 IBaseService接口 using System;
using System.Linq;
using System.Linq.Expressions;
using PMS.IDAL;namespace PMS.IBLL
{public interface IBaseServiceT where T : class,new(){IDbSession CurrentDbSession { get; }IBaseDalT CurrentDal { get; set; }void SetCurrentDal();IQueryableT LoadEntities(ExpressionFuncT, bool whereLambda);IQueryableT LoadPageEntitiess(int pageIndex, int pageSize, out int totalCount,ExpressionFuncT, bool whereLambda,ExpressionFuncT, s orderbyLambda, bool isAsc);bool DeleteEntity(T entity);bool EditEntity(T entity);T AddEntity(T entity);}
} IUserService接口: using PMS.Model;namespace PMS.IBLL
{public partial interface IUserService:IBaseServiceUser{}
} 使用UserService类实现IUserService接口: public partial class UserService : BaseServiceUser, IUserService 以上我们就完成了整个框架中关于User类的各层次的实现。转载于:https://www.cnblogs.com/WayneShao/p/5876880.html