ASP.NET MVC5 网站开发框架模型、数据存储、业务逻(4)

ContextFactory是一个简单工厂类,GetCurrentContext()是一个静态函数。利用简单工厂获取请求内的当前DbContext,也就是请求内的DbContext单例。先添加一个工厂类ContextFactory

using System.Data.Entity; using System.Runtime.Remoting.Messaging; namespace Ninesky.DAL { /// <summary> /// 上下文简单工厂 /// <remarks> /// 创建:2014.02.05 /// </remarks> /// </summary> public class ContextFactory { /// <summary> /// 获取当前数据上下文 /// </summary> /// <returns></returns> public static NineskyDbContext GetCurrentContext() { NineskyDbContext _nContext = CallContext.GetData("NineskyContext") as NineskyDbContext; if (_nContext == null) { _nContext = new NineskyDbContext(); CallContext.SetData("NineskyContext", _nContext); } return _nContext; } } }

这里是先在CallContext中获取NineskyContext,如果为空则初始化一个NineskyContext,如果存在则直接返回。看CallContext,MSDN中讲CallContext提供对每个逻辑执行线程都唯一的数据槽,而在WEB程序里,每一个请求恰巧就是一个逻辑线程所以可以使用CallContext来实现单个请求之内的DbContext单例。

下面添加具体的仓储代码。

在DAL中再添加一个UserRepository类,继承自BaseRepository和InterfaceUserRepository。目的是继承自BaseRepository类,实现InterfaceUserRepositor接口。

using Ninesky.IDAL; using Ninesky.Models; using System.Linq; namespace Ninesky.DAL { /// <summary> /// 用户仓库 /// <remarks>创建:2014.02.03</remarks> /// </summary> class UserRepository: BaseRepository<User>, InterfaceUserRepository { } }

UserRepository就直接继承了基类中的方法,基类中的方法能满足绝大部分需要,UserRepository就不用再增加函数了,其他Repository类都类似,不在贴代码了。

这里我们在建一个Repository工厂,用来返回项目中的所有Repository类。

using Ninesky.IDAL; namespace Ninesky.DAL { /// <summary> /// 简单工厂? /// <remarks>创建:2014.02.03</remarks> /// </summary> public static class RepositoryFactory { /// <summary> /// 用户仓储 /// </summary> public static InterfaceUserRepository UserRepository { get { return new UserRepository(); } } } }

以后在BLL中调用的时候就不用每次都写InterfaceUserRepository _iUserRsy = new  UserRepository()了,直接写成InterfaceUserRepository _iUserRsy = RepositoryFactory.UserRepository这个东西的好处就是,以后在DAL项目中实现InterfaceUserRepository接口的类需要修改时我们可以直接创建个新类,然后RepositoryFactory类中让UserRepository属性返回新类就行了。

3、IBLL项目
IBLL是业务逻辑层的接口,业务逻辑层对数据库的操作上基本还是增、删、改。同样写一个基接口把这三个操作写进去,这里与IDAL思路类似。

namespace Ninesky.IBLL { /// <summary> /// 接口基类 /// <remarks>创建:2014.02.03</remarks> /// </summary> public interface InterfaceBaseService<T> where T : class { /// <summary> /// 添加 /// </summary> /// <param>数据实体</param> /// <returns>添加后的数据实体</returns> T Add(T entity); /// <summary> /// 更新 /// </summary> /// <param>数据实体</param> /// <returns>是否成功</returns> bool Update(T entity); /// <summary> /// 删除 /// </summary> /// <param>数据实体</param> /// <returns>是否成功</returns> bool Delete(T entity); } }


在添加一个InterfaceUserService接口,继承自InterfaceBaseService。根据需要在接口中又添加了几个方法。在这里对Find方法的名称进行统一,凡是返回实体类的名称为Find()或FindByXXX(),返回一组数据的方法名称为FindList()或FindXXXList,分页的名称格式为FindPageList()或FindxxxPageList()

using Ninesky.Models; using System.Linq; namespace Ninesky.IBLL { /// <summary> /// 用户相关接口 /// <remarks> /// 创建:2014.02.09 /// </remarks> /// </summary> public interface InterfaceUserService:InterfaceBaseService<User> { /// <summary> /// 用户是否存在 /// </summary> /// <param>用户名</param> /// <returns>布尔值</returns> bool Exist(string userName); /// <summary> /// 查找用户 /// </summary> /// <param>用户ID</param> /// <returns></returns> User Find(int userID); /// <summary> /// 查找用户 /// </summary> /// <param>用户名</param> /// <returns></returns> User Find(string userName); /// <summary> /// 用户列表 /// </summary> /// <param>页码数</param> /// <param>每页记录数</param> /// <param>总记录数</param> /// <param>排序:0-ID升序(默认),1ID降序,2注册时间升序,3注册时间降序,4登录时间升序,5登录时间降序</param> /// <returns></returns> IQueryable<User> FindPageList(int pageIndex, int pageSize, out int totalRecord,int order); } }

4、BLL项目
BLL项目中要实现InterfaceUserService接口的方法,先添加BaseService的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwxsp.html