小弟最近在网上自学仓储模式,自己整理了一个基础的底层框架,来这里记录分享一下。
有什么不好的地方欢迎各位大佬点评指导!!!!!
之前写了一篇发现不太友好,今天又重新发布一篇简单的说一下实现逻辑。
orm框架:dapper,dapper.Contrib(dapper 扩展),dapper的性能有orm之王的称号,具体大家可以网上找资料了解了解。
设计模式:Repository(个人也不太了解仓储模式,有了解大佬可以给小弟上上课)
web:mvc
最后使用autofac依赖注入达到进一步解耦
创建IRepository接口:
实现Repository接口:
public class DbBaseRepository<T,TKey> : IDbBaseRepository<T, TKey> where T : class , new()
{
protected readonly string dbType = ConfigurationManager.AppSettings["DBType"];
protected IDbSession DbSession => DbConnectionFactory.CreateSession(dbType);
public virtual List<T> GetAll(bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
return dbSession.Connection.GetAll<T>()?.ToList(); ;
}
catch (Exception ex)
{
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual T GetByKey(TKey id, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
return dbSession.Connection.Get<T>(id);
}
catch (Exception ex)
{
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual long Insert(T entity, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
long result = 0;
if (useTransaction)
{
dbSession.BeginTrans();
result = dbSession.Connection.Insert(entity, dbSession.Transaction);
dbSession.Commit();
}
else
result = dbSession.Connection.Insert(entity, null);
return result;
}
catch (Exception ex)
{
if (useTransaction)
dbSession.Rollback();
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual bool Update(T entity, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
bool result = false;
if (useTransaction)
{
dbSession.BeginTrans();
result = dbSession.Connection.Update(entity, dbSession.Transaction);
dbSession.Commit();
}
else
{
result = dbSession.Connection.Update(entity, null);
}
return result;
}
catch (Exception ex)
{
if (useTransaction)
dbSession.Rollback();
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual bool Delete(T entity, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
bool result = false;
if (useTransaction)
{
dbSession.BeginTrans();
result = dbSession.Connection.Delete(entity, dbSession.Transaction);
dbSession.Commit();
}
else
{
result = dbSession.Connection.Delete(entity, null);
}
return result;
}
catch (Exception ex)
{
if (useTransaction)
dbSession.Rollback();
throw ex;
}
finally
{
dbSession.Dispose();
}
}
//参数化接口
public virtual int InsertBatch(string sql, List<T> entityList, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
int result = 0;
if (useTransaction)
{
dbSession.BeginTrans();
result = dbSession.Connection.Execute(sql, entityList, dbSession.Transaction);
dbSession.Commit();
}
else
result = dbSession.Connection.Execute(sql, entityList, null);
return result;
}
catch (Exception ex)
{
if (useTransaction)
dbSession.Rollback();
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual int DbParamsCUD(string sql, DynamicParameters parameters, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
int result = 0;
if (useTransaction)
{
dbSession.BeginTrans();
result = dbSession.Connection.Execute(sql, parameters, dbSession.Transaction);
dbSession.Commit();
}
else
result = dbSession.Connection.Execute(sql, parameters, null);
return result;
}
catch (Exception ex)
{
if (useTransaction)
dbSession.Rollback();
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual List<T> QueryPagingOrSQL(string sql, DynamicParameters parameters, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
IEnumerable<T> result = null;
CommandType comType = CommandType.Text;
if (sql.Contains("dbo.Proc_"))
comType = CommandType.StoredProcedure;
if (useTransaction)
{
dbSession.BeginTrans();
result = dbSession.Connection.Query<T>(sql, parameters, dbSession.Transaction, true, null, commandType: comType);
dbSession.Commit();
}
else
result = dbSession.Connection.Query<T>(sql, parameters, dbSession.Transaction, true, null, commandType: comType);
return result?.ToList();
}
catch (Exception ex)
{
throw ex;
}
finally
{
dbSession.Dispose();
}
}
public virtual T QueryEntity(string sql, DynamicParameters parameters, bool useTransaction = false)
{
IDbSession dbSession = DbSession;
try
{
T entity = null;
if (useTransaction)
{
dbSession.BeginTrans();
entity = dbSession.Connection.QuerySingleOrDefault<T>(sql, parameters, dbSession.Transaction);
dbSession.Commit();
}
else
entity = dbSession.Connection.QuerySingleOrDefault<T>(sql, parameters, null);
return entity;
}
catch (Exception ex)
{
throw ex;
}
finally
{
dbSession.Dispose();
}
}
}
创建IServiceBase接口,主要是封装Repository的接口,个人把它理解成IDAL层 :
新建ServiceBase类实现IServiceBase(DAL):
public abstract class ServiceBase<T, TKey> : IServiceBase<T, TKey> where T : class, new()
{
public IDbBaseRepository<T, TKey> baseRepository;
public virtual List<T> GetAll(bool useTransaction = false)
{
return baseRepository.GetAll();
}
public virtual T GetByKey(TKey id, bool useTransaction = false)
{
return baseRepository.GetByKey(id);
}
public virtual long Insert(T entity, bool useTransaction = false)
{
return baseRepository.Insert(entity, useTransaction);
}
public virtual bool Update(T entity, bool useTransaction = false)
{
return baseRepository.Update(entity, useTransaction);
}
public virtual bool Delete(T entity, bool useTransaction = false)
{
return baseRepository.Delete(entity, useTransaction);
}
//参数化接口
public virtual int InsertBatch(string sql, List<T> entityList, bool useTransaction = false)
{
return baseRepository.InsertBatch(sql, entityList, useTransaction);
}
public virtual int DbParamsCUD(string sql, DynamicParameters parameters, bool useTransaction = false)
{
return baseRepository.DbParamsCUD(sql, parameters, useTransaction);
}
public virtual List<T> QueryPagingOrSQL(string sql, DynamicParameters parameters, bool useTransaction = false)
{
return baseRepository.QueryPagingOrSQL(sql, parameters, useTransaction);
}
public virtual T QueryEntity(string sql, DynamicParameters parameters, bool useTransaction = false)
{
return baseRepository.QueryEntity(sql, parameters, useTransaction);
}
}
新建IUserRepository接口:
public interface IUserRepository : IDbBaseRepository<UserEntity, int>
{
}
新建UserRepository类实现IUserRepository接口方法:
public class UserRepository : DbBaseRepository<UserEntity,int>, IUserRepository
{
}
新建IUserService接口:
public interface IUserService : IServiceBase<UserEntity, int>
{
UserEntity GetUser(string account);
List<UserEntity> GetUserPagingData(string Account, string UserName, int pageIndex, int pageSize, ref int rowsCount, int isLast);
}
新建UserService类实现IUserService接口方法:
public class UserService : ServiceBase<UserEntity, int>, IUserService
{
IUserRepository _repository;
public UserService(IUserRepository repository)
{
this._repository = repository;
base.baseRepository = repository;
}
public UserEntity GetUser(string account)
{
string sql = @"select ID,Account,UserName,English_Name,[PassWord],[Status],Email,Phone,IsEnable,CreateTime,(stuff((
SELECT ',' + RoleCode FROM Sys_Role WHERE RoleCode = RoleCode and ID in (select RoleId from Sys_UserRole where UserId = u.ID)
FOR XML path('') ), 1, 1, '') ) Roles from Sys_User u where u.Account = @Account and u.IsEnable = 1";
DynamicParameters dataParams = new DynamicParameters();
dataParams.Add("@Account", account);
return QueryEntity(sql, dataParams);
}
public List<UserEntity> GetUserPagingData(string Account, string UserName, int pageIndex, int pageSize, ref int rowsCount, int isLast)
{
DynamicParameters dataParams = new DynamicParameters();
dataParams.Add("@Account", Account);
dataParams.Add("@UserName", UserName);
dataParams.Add("@pageIndex", pageIndex);
dataParams.Add("@pageSize", pageSize);
dataParams.Add("@rowsCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
dataParams.Add("@IsLast", isLast);
var result = QueryPagingOrSQL("dbo.Proc_UserConfigPaging", dataParams);
rowsCount = dataParams.Get<int>("@rowsCount");
return result;
}
}
创建UserEntity :
[Serializable]
[Table("Sys_User")]
public class UserEntity
{
public int ID { get; set; }
public string Account { get; set; }
public string UserName { get; set; }
public string English_Name { get; set; }
public string PassWord { get; set; }
private string status = "ON";
public string Status { get { return status; } set { status = value; } }
public string Email { get; set; }
public string Phone { get; set; }
public bool IsEnable { get; set; }
[Write(false)]
public virtual string Roles { get; set; }
public string CreateTime { get; set; }
}
mvc中使用autofac注入IUserService:
public class Bootstrapper
{
public static void AutofacRegister()
{
SetAutofacContainer();
}
private static void SetAutofacContainer()
{
//创建autofac管理注册类的容器实例
var builder = new ContainerBuilder();
//为这个容器注册它可以管理的类型
//builder的Register方法可以通过多种方式注册类型。
//builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerLifetimeScope();
//builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
//builder.RegisterAssemblyTypes(GetAssemblyByName("R.IRepository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(GetAssemblyByName("R.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();
builder.RegisterAssemblyTypes(GetAssemblyByName("R.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();
//使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
builder.RegisterControllers(Assembly.GetExecutingAssembly());//生成具体的实例
//如果使用属性注入 就把上面这句改为
//builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); // 这样支持属性注入
var container = builder.Build();
//下面就是使用MVC的扩展 更改了MVC中的注入方式.
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
/// <summary>
/// 根据程序集名称获取程序集
/// </summary>
/// <param name="AssemblyName">程序集名称</param>
/// <returns></returns>
public static Assembly GetAssemblyByName(String AssemblyName)
{
return Assembly.Load(AssemblyName);
}
}
控制器中使用构造注入IUserService,以及简单使用:
只要参考资料:
主要参考资料来自:https://www.cnblogs.com/YUTOUYUWEI/p/10450953.html
代码链接:https://pan.baidu.com/s/11kgI4aXsM7bGzP4A3bVQng
提取码:8ikf
以上就是整个框架的结构以及实现,希望与大佬们相互学习共同进步,有写的不好或者需要改进的地方欢迎各位大佬留言点评,指导指导小弟,谢谢!!!!