仓储模式:
Repository&IRepository 仓储层
Service&IService 服务层
Models 数据层
1.使用sqlsugar,一般在Models层引入SqlSugarCore 和 SqlSugar.IOC 两个Get包 因为其他层一般都会调用到models层,因此只需在models引入包,其他调用models层即可
2.增删改查是基本的,因此创建一个Base基类,包括了增删改查。当其他实体需要CRUD以外的方法时,重写/override或者新增对应的方法即可
2.1 I开头写接口,反之写实现(服务层一样)
/// <summary> /// 增 /// <returns></returns> bool Inserta(T entity); /// <summary> /// 删 /// <returns></returns> bool Delete(int id); /// <summary> /// 改 /// <returns></returns> bool Updata(T entity); /// <summary> /// 查询全部 /// <returns></returns> List<T> QueryAll(); /// <summary> /// 条件查询所有 /// <returns></returns> List<T> QueryConditionAll(Expression<Func<T,bool>> expression); /// <summary> /// 查询第一个 /// <returns></returns> T QueryFirst(int id); /// <summary> /// 根据条件查询第一个 /// <returns></returns> T QueryConditionFirst(Expression<Func<T, bool>> expression);
public bool Delete(int id) { return base.DeleteById(id); } public bool Inserta(T entity) { return base.Insert(entity); } public List<T> QueryAll() { return base.GetList(); } public List<T> QueryConditionAll(Expression<Func<T, bool>> expression) { return base.GetList(expression); } public T QueryConditionFirst(Expression<Func<T, bool>> expression) { return base.GetFirst(expression); } public T QueryFirst(int id) { return base.GetById(id); } public bool Updata(T entity) { return base.Update(entity); }
3. Startup配置。这里使用的是sqlsugar自带的IOC进行依赖注入,以此来使用sqlsugar SqlSugar.IOC/依赖注入 - SqlSugar 5x - .NET果糖网 (donet5.com)
#region SQLsugarIOC 注入配置 services.AddSqlSugar(new SqlSugar.IOC.IocConfig() { ConnectionString = Configuration["SqlConnection"], //数据库连接字符串 DbType = SqlSugar.IOC.IocDbType.SqlServer, //数据库类型 IsAutoCloseConnection = true //自动释放 }); #endregion
4. 之前用EF添加数据模型之后自动都根据数据库生成的实体,sqlsugar有一点不同的是需要自己写代码去操作同步。
可以通过写的实体类去生成数据库,或者根据数据库生成实体。我比较喜欢前者,因为后者要去设置一下文件的路径,感觉有点不好用。
4.1 通过实体生成数据库 或者 通过数据库生成 实体Db First 实体生成 - SqlSugar 5x - .NET果糖网 (donet5.com)
仓储模式使用 sqlsugar。在BaseRepository中写代码。首先要继承SimpleClient<T>,其后 再 继承接口
在执行到这个类的时候,会将ISqlSugarClient 注入进来,
(个人理解仓储层继承base,将注入进来的ISqlSugarClient传给base 。Context上下文=bScoped.SugarScope)这点我理解不够深层次,如果有大佬看到了可以交流交流
public class BaseRepository<T> : SimpleClient<T>, IBaseRepository<T> where T : class, new() { public BaseRepository(ISqlSugarClient sqlSugar = null) : base(sqlSugar) { base.Context = DbScoped.SugarScope; //下面是生成数据库的操作,执行一遍就行,然后可以注释掉 base.Context.DbMaintenance.CreateDatabase();//如果没有数据库就会先创建,有就不创建了 base.Context.CodeFirst.InitTables( //初始化表 typeof(ArticleInfo), typeof(ArticleTypeInfo), typeof(UserInfo), typeof(UserTypeInfo) ); //生成实体位置 参数一路径 参数二命名空间 base.Context.DbFirst.CreateClassFile("C:/", "WebBokeModels"); } }
5. 服务层的写法跟仓储层一样,省略了……
5.1 根据实体分别创建出仓储层和服务层的接口和实现类
例如:
IArticleInfoService继承IBaseService<ArticleInfo>
ArticleInfoService继承BaseService<ArticleInfo>,IArticleInfoService……
增删改查都是基本需要的,因此都继承base类,如果需要其他扩展方法在与实体对应的接口和类里面添加方法,或重写方法。
6.添加API控制器,此时数据库还没建立。数据库会在项目第一次运行的时候建立。因此数据库此时是空的,我们先各自添加一个添加的方法。
Userinfo 用户信息 UserType 用户角色 ArticleInfo 文章表 ArticleType 文章类型