本节讲解业务逻辑层BLL。很简单和DAO层类似,通过泛型封装相似的功能到父类,其他子类继承父类即可,具体看下面操作。
一、业务逻辑接口层IBLL
1. 在解决方案上右键新建一个类库,命名为IBLL,用来存放业务逻辑接口层代码,并添加引用实体层Model,数据库访问接口层IDAO;
2. 在类库中添加一个父接口,命名为IBLL,并定义常用的方法,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IDAO;
namespace IBLL
{
public interface IBLL<T>
{
IDAO<T> Dao { get; set; }
/// <summary>
/// 添加实体
/// </summary>
/// <param name="entity"></param>
int Add(T entity);
/// <summary>
/// 修改实体
/// </summary>
/// <param name="entity"></param>
void Update(T entity);
/// <summary>
/// 保存或修改实体
/// </summary>
/// <param name="customer"></param>
void SaveOrUpdate(IList<T> list);
/// <summary>
/// 删除实体
/// </summary>
/// <param name="entity"></param>
void Delete(T entity);
/// <summary>
/// 按条件删除
/// </summary>
/// <param name="sqlWhere">删除条件</param>
void Delete(string sqlWhere);
/// <summary>
/// 根据ID得到实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
T Get(int id);
/// <summary>
/// 根据ID得到实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
T Load(int id);
/// <summary>
/// 得到所有实体
/// </summary>
/// <returns></returns>
IList<T> LoadAll();
/// <summary>
/// 按条件排序得到前N条记录
/// </summary>
/// <param name="top">获取条数</param>
/// <param name="field">排序字段</param>
/// <param order="field">排序方式,升序asc,降序desc</param>
/// <returns></returns>
IList<T> QueryTop(int top, string field, string order = "asc");
/// <summary>
/// 根据条件得到实体
/// </summary>
/// <param name="sqlWhere">查询条件</param>
/// <returns></returns>
IList<T> Where(string sqlWhere="");
/// <summary>
/// 得到统计数量
/// </summary>
/// <param name="strWhere">查询条件</param>
/// <returns></returns>
int GetRecordCount(string strWhere = "");
/// <summary>
/// 分页获取数据列表
/// </summary>
/// <param name="PageSize">每页获取数据条数</param>
/// <param name="PageIndex">当前页是第几页</param>
/// <param name="strWhere">查询条件</param>
/// <returns></returns>
IList<T> GetPageList(int PageSize, int PageIndex, string strWhere = "");
/// <summary>
/// 根据数据字典父编码和编码获取名称
/// </summary>
/// <param name="parentNumber">父编码</param>
/// <param name="number">编码</param>
/// <returns></returns>
string GetName(string parentNumber, string number);
/// <summary>
/// 获取该父编码下最大编码
/// </summary>
/// <param name="parentNumber">父编码</param>
/// <returns></returns>
string GetMaxNumber(string parentNumber);
}
}
3.定义好了父接口,下面定义子接口,还是以IT_RoleBLL为例,代码如下:
using System;
using Model;
namespace IBLL
{
public interface IT_RoleBLL : IBLL<T_Role>
{
}
}
这样,IT_RoleBLL就拥有了IBLL定义了的方法,如果IT_RoleBLL有特殊方法,直接添加在IT_RoleBLL里面即可,以IT_AreaBLL为例,代码如下:
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace IBLL
{
public interface IT_AreaBLL : IBLL<T_Area>
{
int GenerateAreaNumber(string parentNumber);
}
}
最后,我们看一下IBLL层的目录结构:
二、业务逻辑实现层BLL
1. 在解决方案上右键新建一个类库,命名为BLL,用来存放业务逻辑实现层代码,并添加引用IBLL接口层、实体层Model和数据库访问接口层IDAO;
2. 在类库中添加一个父接口,命名为BLL,并定义常用的方法,代码如下:
using IBLL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using IDAO;
namespace BLL
{
public class BLL<T>:IBLL<T>
{
public IDAO<T> Dao { get; set; }
/// <summary>
/// 添加实体
/// </summary>
/// <param name="entity"></param>
public int Add(T entity)
{
return Dao.Add(entity);
}
/// <summary>
/// 修改实体
/// </summary>
/// <param name="entity"></param>
public void Update(T entity)
{
Dao.Update(entity);
}
/// <summary>
/// 保存或修改实体
/// </summary>
/// <param name="customer"></param>
public void SaveOrUpdate(IList<T> list)
{
Dao.SaveOrUpdate(list);
}
/// <summary>
/// 删除实体
/// </summary>
/// <param name="entity"></param>
public void Delete(T entity)
{
Dao.Delete(entity);
}
/// <summary>
/// 按条件删除
/// </summary>
/// <param name="sqlWhere">删除条件</param>
public void Delete(string sqlWhere)
{
Dao.Delete(sqlWhere);
}
/// <summary>
/// 根据ID得到实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public T Get(int id)
{
return Dao.Get(id);
}
/// <summary>
/// 根据ID得到实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public T Load(int id)
{
return Dao.Load(id);
}
/// <summary>
/// 得到所有实体
/// </summary>
/// <returns></returns>
public IList<T> LoadAll()
{
return Dao.LoadAll();
}
/// <summary>
/// 按条件排序得到前N条记录
/// </summary>
/// <param name="top">获取条数</param>
/// <param name="field">排序字段</param>
/// <param order="field">排序方式,升序asc,降序desc</param>
/// <returns></returns>
public IList<T> QueryTop(int top, string field, string order = "asc")
{
return Dao.QueryTop(top,field,order);
}
/// <summary>
/// 根据条件得到实体
/// </summary>
/// <param name="sqlWhere">查询条件</param>
/// <returns></returns>
public IList<T> Where(string sqlWhere = "")
{
return Dao.Where(sqlWhere);
}
/// <summary>
/// 得到统计数量
/// </summary>
/// <param name="strWhere">查询条件</param>
/// <returns></returns>
public int GetRecordCount(string strWhere="")
{
return Dao.GetRecordCount(strWhere);
}
/// <summary>
/// 分页获取数据列表
/// </summary>
/// <param name="PageSize">每页获取数据条数</param>
/// <param name="PageIndex">当前页是第几页</param>
/// <param name="strWhere">查询条件</param>
/// <returns></returns>
public IList<T> GetPageList(int PageSize, int PageIndex, string strWhere="")
{
return Dao.GetPageList(PageSize,PageIndex,strWhere);
}
/// <summary>
/// 根据数据字典父编码和编码获取名称
/// </summary>
/// <param name="parentNumber">父编码</param>
/// <param name="number">编码</param>
/// <returns></returns>
public string GetName(string parentNumber, string number)
{
return Dao.GetName(parentNumber, number);
}
/// <summary>
/// 获取该父编码下最大编码
/// </summary>
/// <param name="parentNumber">父编码</param>
/// <returns></returns>
public string GetMaxNumber(string parentNumber)
{
int max = Dao.GetMaxNumber(parentNumber);
return parentNumber + max.ToString().PadLeft(4, '0');
}
}
}
3.定义好了父接口,下面定义子接口,以T_RoleBLL为例,代码如下:
using System;
using IBLL;
using Model;
namespace BLL
{
public class T_RoleBLL : BLL<T_Role>,IT_RoleBLL
{
}
}
这样,T_RoleBLL就拥有了BLL定义了的方法,如果T_RoleBLL有特殊方法,直接添加在T_RoleBLL里面即可。不过要注意,对ITRoleDAO要单独实例化,原因:BLL中实例化的IDAO<T>对象仅仅是拥调用IDAO中定义的方法,并不拥有单独在子类定义的方法。以T_AreaBLL为例,代码如下:
using IBLL;
using IDAO;
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BLL
{
public class T_AreaBLL : BLL<T_Area>,IT_AreaBLL
{
public IT_AreaDAO AreaDao { get; set; }
public int GenerateAreaNumber(string parentNumber)
{
return AreaDao.GenerateAreaNumber(parentNumber);
}
}
}
至于BLL中的Dao和T_AreaBLL中的AreaDao是如何被实例化的,我们在下一节再说!大家可以回忆一下DAO层中ISessionFactory对象SessionFactory是如何实例化的?这里用到了Spring.NET的依赖注入功能。最后,还是看一下BLL层的目录结构: