在框架搭建-MVC分离中实现了mvc的Model、View、Controller分离,本文将在此基础上进行三层架构的搭建。项目解决方法图及BLL(业务逻辑层)、DAL(数据访问层)思维导图如下:
为便于理解需先了解温习几个概念
- 接口:接口定义了所有类继承接口时应遵循的语法合同,接口提供了派生类应遵循的标准结构。
- 派生类:当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。
- 接口与派生类:接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。
- 多态性:在面向对象编程范式中,多态性往往表现为”一个接口,多个功能”。可自行了解“依赖反转、里氏替换原则”等。
- T4模板:EntityFramework中就使用T4模板实现数据库向实体模型的映射,是一种快速生成代码的模板引擎。
- 泛型:泛型是包含类型参数的一种类型 ,实质是为了避免大量重构而将传入参数类型作为变量进行传递来实现重构的效果 。
DAL数据访问层
IDAL为数据访问层接口类库,为以后面对不同数据库提供扩展,对数据访问层的方法进行约束,同时面向接口降低程序的耦合性以及提升程序的可扩展性。
DAL为对数据访问层接口方法的实现。
- IDbContextFactory.cs:EntityFramework上下文工厂接口类,提供GetDbContext()得到EF上下文方法接口。
- IDbDALFactory.cs:dal仓储工厂接口类,提供GetDbDAL()得到dal仓储方法接口。
- IDbDALRepository.tt:利用T4模板生成各个实体类对应的dal数据访问仓储。
- IBaseDAL.cs:数据访问泛型方法接口类,提供基本的增删改查方法的接口约束。
- IDAL.tt:利用T4模板生成各个实体类对IBaseDAL泛型类的继承类,使各个实体类拥有其基类IBaseDAL的各个方法。
- DAL中的各个类为对IDAL各个接口类的实现。
BLL业务逻辑层
IBLL为业务逻辑层接口类库,为以后面对不同数据库提供扩展,对业务逻辑层的方法进行约束,同时面向接口降低程序的耦合性以及提升程序的可扩展性。
BLL为对业务逻辑层接口方法的实现。
- IBLLFactory.cs:bll仓储工厂接口类,提供GetBLLRepository()得到bll仓储方法接口。
- IBLLRepository.tt:利用T4模板生成各个实体类对应的bll数据访问仓储。
- IBaseBLL.cs:业务逻辑泛型方法接口类,提供基本的增删改查业务逻辑方法的接口约束。
- IBLL.tt:利用T4模板生成各个实体类对IBaseBLL泛型类的继承类,使各个实体类拥有其基类IBaseBLL的各个方法。
- BLL中的各个类为对IBLL各个接口类的实现。
程序运行流程:
代码示例:
1.DbContextFactory.cs
namespace ZheYK.DAL
{
/// <summary>
/// EF上下文工厂实现
/// </summary>
public class DbContextFactory : IDbContextFactory
{
/// <summary>
/// 获取EF上下文
/// 创建人:o527883184
/// 日期:2018年1月11日20点28分
/// </summary>
/// <returns>EF上下文</returns>
public DbContext GetDbContext()
{
// 从线程中得到EF上下文(类似键值对)
DbContext dbContext = CallContext.GetData(typeof(DbContextFactory).Name) as DbContext;
if (dbContext == null)
{
dbContext = new Entities();
// 将EF上下文存入线程(类似键值对)
CallContext.SetData(typeof(DbContextFactory).Name, dbContext);
}
return dbContext;
}
}
}
2.DAL.tt
namespace ZheYK.DAL
{
public partial class Blog_ArticleDAL : BaseDAL<Blog_Article> ,IBlog_ArticleDAL
{
}
public partial class Blog_ArticleItemDAL : BaseDAL<Blog_ArticleItem> ,IBlog_ArticleItemDAL
{
}
······
}
3.BaseDAL.cs
namespace ZheYK.DAL
{
public class BaseDAL<T> : IBaseDAL<T> where T : class, new()
{
/// <summary>
/// EF上下文对象
/// </summary>
DbContext dbContext = new DbContextFactory().GetDbContext();
/// <summary>
/// 数据源
/// </summary>
public IQueryable<T> Entities
{
get
{
return dbContext.Set<T>();
}
}
/// <summary>
/// 新增数据
/// 创建人:o527883184
/// 日期:2018-01-12 17:08
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns></returns>
public int Create(T entity)
{
dbContext.Entry<T>(entity).State = EntityState.Added;
return dbContext.SaveChanges();
}
/// <summary>
/// 删除数据
/// 创建人:o527883184
/// 日期:2018-01-12 17:09
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns></returns>
public int Delete(T entity)
{
dbContext.Set<T>().Attach(entity);
dbContext.Entry<T>(entity).State = EntityState.Deleted;
return dbContext.SaveChanges();
}
/// <summary>
/// 更新数据
/// 创建人:o527883184
/// 日期:2018-01-12 17:13
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns></returns>
public int Update(T entity)
{
if (dbContext.Entry<T>(entity).State == EntityState.Modified)
{
return dbContext.SaveChanges();
}
else if (dbContext.Entry<T>(entity).State == EntityState.Detached)
{
try
{
dbContext.Set<T>().Attach(entity);
dbContext.Entry<T>(entity).State = EntityState.Modified;
return dbContext.SaveChanges();
}
catch (InvalidOperationException)
{
return -1;
}
}
else
{
return -1;
}
}
/// <summary>
/// 查询数据
/// 创建人:o527883184
/// 日期:2018-01-12 17:10
/// <param name="whereLambda">查询条件</param>
/// </summary>
/// <returns>数据实体</returns>
public T Get(Expression<Func<T, bool>> whereLambda)
{
return Entities.Where(whereLambda).FirstOrDefault();
}
······
}
}
4.DbDALFactory.cs
namespace ZheYK.DAL
{
/// <summary>
/// 数据实体类DAL工厂实现
/// </summary>
public class DbDALFactory : IDbDALFactory
{
/// <summary>
/// 得到DbDAL
/// </summary>
/// <returns></returns>
public IDbDALRepository GetDbDAL()
{
// 从线程中得到DbDAL(类似键值对)
IDbDALRepository dbDAL = CallContext.GetData(typeof(DbDALFactory).Name) as DbDALRepository;
if (dbDAL == null)
{
dbDAL = new DbDALRepository();
// 将DbDAL存入线程(类似键值对)
CallContext.SetData(typeof(DbDALFactory).Name, dbDAL);
}
return dbDAL;
}
}
}
5.DbDALRepository.tt
namespace ZheYK.DAL
{
public partial class DbDALRepository:IDbDALRepository
{
IBlog_ArticleDAL _iBlog_ArticleDAL;
/// </summary>
/// Blog_ArticleDAL仓储
/// </summary>
public IBlog_ArticleDAL IBlog_ArticleDAL
{
get
{
if(_iBlog_ArticleDAL == null)
{
_iBlog_ArticleDAL = new Blog_ArticleDAL();
}
return _iBlog_ArticleDAL;
}
set
{
_iBlog_ArticleDAL = value;
}
}
}
public partial class DbDALRepository:IDbDALRepository
{
IBlog_ArticleItemDAL _iBlog_ArticleItemDAL;
/// </summary>
/// Blog_ArticleItemDAL仓储
/// </summary>
public IBlog_ArticleItemDAL IBlog_ArticleItemDAL
{
get
{
if(_iBlog_ArticleItemDAL == null)
{
_iBlog_ArticleItemDAL = new Blog_ArticleItemDAL();
}
return _iBlog_ArticleItemDAL;
}
set
{
_iBlog_ArticleItemDAL = value;
}
}
}
······
}
6.BaseBLL.cs
namespace ZheYK.BLL
{
public abstract class BaseBLL<T> : IBaseBLL<T> where T : class, new()
{
protected IBaseDAL<T> idal;
// 抽象方法,得到泛型对应的DAL
public abstract void GetIDal();
// 数据层仓储
private IDbDALRepository _iDbDALRepository;
public IDbDALRepository DbDALRepository
{
get
{
if (_iDbDALRepository == null)
{
_iDbDALRepository = new DbDALFactory().GetDbDAL();
}
return _iDbDALRepository;
}
}
/// <summary>
/// 数据源
/// </summary>
//private IQueryable<T> Entities
//{
// get
// {
// return idal.Entities;
// }
//}
public int Create(T entity)
{
return this.idal.Create(entity);
}
public int Delete(T entity)
{
return idal.Delete(entity);
}
public T Get(Expression<Func<T, bool>> whereLambda)
{
return idal.Get(whereLambda);
}
······
}
}
7.BLLFactory.cs
namespace ZheYK.BLL
{
/// <summary>
/// 业务实体BLL工厂
/// 创建人:o527883184
/// 日期:2018-01-12 10:01
/// </summary>
public class BLLFactory : IBLLFactory
{
/// <summary>
/// 得到BLLRepository
/// </summary>
/// <returns></returns>
public IBLLRepository GetBLLRepository()
{
IBLLRepository bllFactory = CallContext.GetData(typeof(BLLFactory).Name) as BLLRepository;
if (bllFactory == null)
{
bllFactory = new BLLRepository();
CallContext.SetData(typeof(BLLFactory).Name, bllFactory);
}
return bllFactory;
}
}
}
8.BLLRepository.tt
namespace ZheYK.BLL
{
public partial class BLLRepository:IBLLRepository
{
IBlog_ArticleBLL _iBlog_ArticleBLL;
/// </summary>
/// Blog_ArticleBLL仓储
/// </summary>
public IBlog_ArticleBLL IBlog_ArticleBLL
{
get
{
if(_iBlog_ArticleBLL == null)
{
_iBlog_ArticleBLL = new Blog_ArticleBLL();
}
return _iBlog_ArticleBLL;
}
set
{
_iBlog_ArticleBLL = value;
}
}
}
public partial class BLLRepository:IBLLRepository
{
IBlog_ArticleItemBLL _iBlog_ArticleItemBLL;
/// </summary>
/// Blog_ArticleItemBLL仓储
/// </summary>
public IBlog_ArticleItemBLL IBlog_ArticleItemBLL
{
get
{
if(_iBlog_ArticleItemBLL == null)
{
_iBlog_ArticleItemBLL = new Blog_ArticleItemBLL();
}
return _iBlog_ArticleItemBLL;
}
set
{
_iBlog_ArticleItemBLL = value;
}
}
}
······
}
9.BLL.tt
namespace ZheYK.BLL
{
internal partial class Blog_ArticleBLL : BaseBLL<Blog_Article> ,IBlog_ArticleBLL
{
public Blog_ArticleBLL()
{
this.GetIDal();
}
public override void GetIDal()
{
idal = DbDALRepository.IBlog_ArticleDAL;
}
}
internal partial class Blog_ArticleItemBLL : BaseBLL<Blog_ArticleItem> ,IBlog_ArticleItemBLL
{
public Blog_ArticleItemBLL()
{
this.GetIDal();
}
public override void GetIDal()
{
idal = DbDALRepository.IBlog_ArticleItemDAL;
}
}
······
}
调用BLL——>DAL——>Entitis
namespace ZheYK.BLL
{
public partial class ArticleBiz
{
#region << 操作上下文 >>
/// <summary>
/// 数据操作上下文
/// </summary>
static IBLLRepository DaoUtil = new BLLFactory().GetBLLRepository();
#endregion
/// <summary>
/// 新增数据
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns></returns>
public static int Create(Blog_Article entity)
{
var dao = DaoUtil.IBlog_ArticleBLL;
return dao.Create(entity);
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns></returns>
public static int Delete(Blog_Article entity)
{
var dao = DaoUtil.IBlog_ArticleBLL;
return dao.Delete(entity);
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="entity">数据实体</param>
/// <returns></returns>
public static int Update(Blog_Article entity)
{
var dao = DaoUtil.IBlog_ArticleBLL;
return dao.Update(entity);
}
/// <summary>
/// 查询数据
/// </summary>
/// <param name="id">主键ID</param>
/// <returns>数据实体</returns>
public static Blog_Article Get(string id)
{
Blog_Article entity = null;
if (!string.IsNullOrEmpty(id))
{
var dao = DaoUtil.IBlog_ArticleBLL;
entity = dao.Get(t => t.ID == id);
}
return entity;
}
······
}
}
IDAL类库源码下载
解压密码:o527883184
IBLL类库源码 下载
解压密码:o527883184
博客系统线上展示地址为http://blog.zheyk.cn/article_iwz1807002.html(博客地址)