好久没有来写博文,最近工作比较忙,最近公司在做新系统,想应用一套注入容器,unity,autofac,spring.net。都是可以选择的,还有自己专门研发封装的“SpeedIoc轻量级容器‘,性能肯定是不用说。
所以就用SpeedIoc+asp.net ef测试了一套新架构。有人说EF性能太差,可是我个人是没有这样觉得。做一般的项目,EF还是可以的,只是首次启动的时候会慢一点。
其中应用的是ef其中之一的代码优先模式,包括自动生成数据库,数据库操层公共接口+实现,业务层公共接口+实现。SpeedIoc对每层接口的注入。主要的代码如下:
using System;
using System.Linq;
namespace EF.IDAL
{
/// <summary>
/// 基于EF,数据库操作层公共接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IBaseRepository<T> where T : class,new()
{
/// <summary>
///
/// </summary>
/// <returns></returns>
IQueryable<T> FindAll();
/// <summary>
/// 获取记录数
/// </summary>
/// <param name="exp">执行的条件返回bool</param>
/// <returns>返回int</returns>
int GetCount(Func<T, bool> exp);
/// <summary>
/// 获取Entities(列表)
/// </summary>
/// <param name="exp">执行的条件返回bool</param>
/// <returns>返回一个IQueryable</returns>
IQueryable<T> GetEntities(Func<T, bool> whereLambda);
/// <summary>
/// 查询Entity(单个)
/// </summary>
/// <param name="exp">执行的条件返回bool</param>
/// <returns>返回实体</returns>
T GetEntity(Func<T, bool> exp);
/// <summary>
/// 添加一个实体到数据库
/// </summary>
/// <param name="entity">要添加到数据库的实体</param>
/// <returns>返回实体</returns>
T AddEntity(T entity);
/// <summary>
/// 修改一个实体
/// </summary>
/// <param name="entity">要修改的实体</param>
/// <returns>返回bool</returns>
bool UpdateEntity(T entity);
/// <summary>
/// 删除一个实体
/// </summary>
/// <param name="entity">要删除的实体</param>
/// <returns>返回bool</returns>
bool DeleteEntity(T entity);
/// <summary>
/// 实现对数据的分页查询
/// </summary>
/// <typeparam name="S">按照某个类进行排序</typeparam>
/// <param name="pageIndex">当前第几页</param>
/// <param name="pageSize">一页显示多少条数据</param>
/// <param name="total">总条数</param>
/// <param name="whereLambda">取得排序的条件</param>
/// <param name="isAsc">如何排序,根据倒叙还是升序</param>
/// <param name="orderByLambda">根据那个字段进行排序</param>
/// <returns>返回IQueryable</returns>
IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total, Func<T, bool> whereLambda,
bool isAsc, Func<T, S> orderByLambda);
}
}
/// <summary>
/// 基于EF,数据库操作层公共实现
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseRepository<T> : IBaseRepository<T> where T : class,new()
{
private WinDbContext db;
public BaseRepository()
{
db = new WinDbContext();
}
/// <summary>
/// 添加一个实体到数据库
/// </summary>
/// <param name="entity">要添加到数据库的实体</param>
/// <returns>返回实体</returns>
public T AddEntity(T entity)
{
db.Entry<T>(entity).State = EntityState.Added;
db.SaveChanges();
return entity;
}
/// <summary>
/// 删除一个实体
/// </summary>
/// <param name="entity">要删除的实体</param>
/// <returns>返回bool</returns>
public bool DeleteEntity(T entity)
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
return db.SaveChanges() > 0;
}
/// <summary>
/// 获取记录数
/// </summary>
/// <param name="exp">执行的条件返回bool</param>
/// <returns>返回int</returns>
public int GetCount(Func<T, bool> exp)
{
return db.Set<T>().Where<T>(exp).ToList<T>().Count;
}
/// <summary>
/// 获取Entities(列表)
/// </summary>
/// <param name="exp">执行的条件返回bool</param>
/// <returns>返回一个IQueryable</returns>
public IQueryable<T> GetEntities(Func<T, bool> whereLambda)
{
return db.Set<T>().Where<T>(whereLambda).AsQueryable();
}
#region 数据库操作层接口注入
//角色信息
builder.RegisterType<RoleDAL>().AsImplementedInterfaces();
//用户信息
builder.RegisterType<UserDAL>().AsImplementedInterfaces();
#endregion
#region 业务逻辑层接口注入
//用户信息
builder.RegisterType<UserBLL>().AsImplementedInterfaces();
//角色信息
builder.RegisterType<RoleBLL>().AsImplementedInterfaces();
#endregion