diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml
index 89cb321..9891d5d 100644
--- a/Blog.Core.Api/Blog.Core.xml
+++ b/Blog.Core.Api/Blog.Core.xml
@@ -1249,6 +1249,50 @@
+
+
+ 分表demo
+
+
+
+
+ 分页获取数据
+
+
+
+
+
+
+
+
+
+
+ 根据ID获取信息
+
+
+
+
+
+
+ 添加一条测试数据
+
+
+
+
+
+
+ 修改一条测试数据
+
+
+
+
+
+
+ 根据id删除数据
+
+
+
+
多租户-多库方案 测试
diff --git a/Blog.Core.Api/Controllers/SplitDemoController.cs b/Blog.Core.Api/Controllers/SplitDemoController.cs
new file mode 100644
index 0000000..fb3c03c
--- /dev/null
+++ b/Blog.Core.Api/Controllers/SplitDemoController.cs
@@ -0,0 +1,199 @@
+using Blog.Core.IServices;
+using Blog.Core.Model;
+using Blog.Core.Model.Models;
+using Blog.Core.Repository.UnitOfWorks;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System.Linq.Expressions;
+
+namespace Blog.Core.Api.Controllers
+{
+ ///
+ /// 分表demo
+ ///
+ [Route("api/[controller]/[action]")]
+ [ApiController]
+ [Authorize(Permissions.Name)]
+ public class SplitDemoController : ControllerBase
+ {
+ readonly ISplitDemoServices splitDemoServices;
+ readonly IUnitOfWorkManage unitOfWorkManage;
+ public SplitDemoController(ISplitDemoServices _splitDemoServices, IUnitOfWorkManage _unitOfWorkManage)
+ {
+ splitDemoServices = _splitDemoServices;
+ unitOfWorkManage = _unitOfWorkManage;
+ }
+
+ ///
+ /// 分页获取数据
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpGet]
+ [AllowAnonymous]
+ public async Task>> Get(DateTime beginTime, DateTime endTime, int page = 1, string key = "", int pageSize = 10)
+ {
+ if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
+ {
+ key = "";
+ }
+ Expression> whereExpression = a => (a.Name != null && a.Name.Contains(key));
+ var data = await splitDemoServices.QueryPageSplit(whereExpression, beginTime, endTime, page, pageSize, " Id desc ");
+ return MessageModel>.Message(data.dataCount >= 0, "获取成功", data);
+ }
+
+ ///
+ /// 根据ID获取信息
+ ///
+ ///
+ ///
+ [HttpGet]
+ [AllowAnonymous]
+ public async Task> GetById(long id)
+ {
+ var data = new MessageModel();
+ var model = await splitDemoServices.QueryByIdSplit(id);
+ if (model != null)
+ {
+ return MessageModel.Success("获取成功", model);
+ }
+ else
+ {
+ return MessageModel.Fail("获取失败");
+ }
+ }
+
+ ///
+ /// 添加一条测试数据
+ ///
+ ///
+ ///
+ [HttpPost]
+ [AllowAnonymous]
+ public async Task> Post([FromBody] SplitDemo splitDemo)
+ {
+ var data = new MessageModel();
+ unitOfWorkManage.BeginTran();
+ var id = (await splitDemoServices.AddSplit(splitDemo));
+ data.success = (id == null ? false : true);
+ try
+ {
+ if (data.success)
+ {
+ data.response = id.FirstOrDefault().ToString();
+ data.msg = "添加成功";
+ }
+ else
+ {
+ data.msg = "添加失败";
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ if (data.success)
+ unitOfWorkManage.CommitTran();
+ else
+ unitOfWorkManage.RollbackTran();
+ }
+ return data;
+ }
+
+ ///
+ /// 修改一条测试数据
+ ///
+ ///
+ ///
+ [HttpPut]
+ [AllowAnonymous]
+ public async Task> Put([FromBody] SplitDemo splitDemo)
+ {
+ var data = new MessageModel();
+ if (splitDemo != null && splitDemo.Id > 0)
+ {
+ unitOfWorkManage.BeginTran();
+ data.success = await splitDemoServices.UpdateSplit(splitDemo, splitDemo.CreateTime);
+ try
+ {
+ if (data.success)
+ {
+ data.msg = "修改成功";
+ data.response = splitDemo?.Id.ObjToString();
+ }
+ else
+ {
+ data.msg = "修改失败";
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ if (data.success)
+ unitOfWorkManage.CommitTran();
+ else
+ unitOfWorkManage.RollbackTran();
+ }
+ }
+ return data;
+ }
+
+ ///
+ /// 根据id删除数据
+ ///
+ ///
+ ///
+ [HttpDelete]
+ [AllowAnonymous]
+ public async Task> Delete(long id)
+ {
+ var data = new MessageModel();
+
+ var model = await splitDemoServices.QueryByIdSplit(id);
+ if (model != null)
+ {
+ unitOfWorkManage.BeginTran();
+ data.success = await splitDemoServices.DeleteSplit(model,model.CreateTime);
+ try
+ {
+ data.response = id.ObjToString();
+ if (data.success)
+ {
+ data.msg = "删除成功";
+ }
+ else
+ {
+ data.msg = "删除失败";
+ }
+
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ if (data.success)
+ unitOfWorkManage.CommitTran();
+ else
+ unitOfWorkManage.RollbackTran();
+ }
+ }
+ else
+ {
+ data.msg = "不存在";
+ }
+ return data;
+
+ }
+ }
+}
diff --git a/Blog.Core.Api/Program.cs b/Blog.Core.Api/Program.cs
index f5223be..2a75498 100644
--- a/Blog.Core.Api/Program.cs
+++ b/Blog.Core.Api/Program.cs
@@ -7,6 +7,7 @@ using Autofac.Extensions.DependencyInjection;
using Blog.Core;
using Blog.Core.Common;
using Blog.Core.Common.Core;
+using Blog.Core.Common.Helper;
using Blog.Core.Common.LogHelper;
using Blog.Core.Extensions;
using Blog.Core.Extensions.Apollo;
@@ -14,6 +15,7 @@ using Blog.Core.Extensions.Middlewares;
using Blog.Core.Filter;
using Blog.Core.Hubs;
using Blog.Core.IServices;
+using Blog.Core.Model;
using Blog.Core.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
@@ -111,6 +113,8 @@ builder.Services.AddControllers(o =>
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
options.SerializerSettings.Converters.Add(new StringEnumConverter());
+ //将long类型转为string
+ options.SerializerSettings.Converters.Add(new NumberConverter(NumberConverterShip.Int64));
})
//.AddFluentValidation(config =>
//{
diff --git a/Blog.Core.Api/Startup.cs b/Blog.Core.Api/Startup.cs
index bc1630f..4f99b62 100644
--- a/Blog.Core.Api/Startup.cs
+++ b/Blog.Core.Api/Startup.cs
@@ -3,6 +3,7 @@ using System.Reflection;
using System.Text;
using Autofac;
using Blog.Core.Common;
+using Blog.Core.Common.Helper;
using Blog.Core.Common.LogHelper;
using Blog.Core.Common.Seed;
using Blog.Core.Extensions;
@@ -10,6 +11,7 @@ using Blog.Core.Extensions.Middlewares;
using Blog.Core.Filter;
using Blog.Core.Hubs;
using Blog.Core.IServices;
+using Blog.Core.Model;
using Blog.Core.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
@@ -123,6 +125,8 @@ namespace Blog.Core
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
//添加Enum转string
options.SerializerSettings.Converters.Add(new StringEnumConverter());
+ //将long类型转为string
+ options.SerializerSettings.Converters.Add(new NumberConverter(NumberConverterShip.Int64));
});
services.Replace(ServiceDescriptor.Transient());
diff --git a/Blog.Core.Common/Helper/NumberConverter.cs b/Blog.Core.Common/Helper/NumberConverter.cs
new file mode 100644
index 0000000..27890fa
--- /dev/null
+++ b/Blog.Core.Common/Helper/NumberConverter.cs
@@ -0,0 +1,174 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Blog.Core.Common.Helper
+{
+ ///
+ ///
+ /// 大数据json序列化重写
+ ///
+ public sealed class NumberConverter : JsonConverter
+ {
+ ///
+ /// 转换成字符串的类型
+ ///
+ private readonly NumberConverterShip _ship;
+
+ ///
+ /// 大数据json序列化重写实例化
+ ///
+ public NumberConverter()
+ {
+ _ship = (NumberConverterShip)0xFF;
+ }
+
+ ///
+ /// 大数据json序列化重写实例化
+ ///
+ /// 转换成字符串的类型
+ public NumberConverter(NumberConverterShip ship)
+ {
+ _ship = ship;
+ }
+
+ ///
+ ///
+ /// 确定此实例是否可以转换指定的对象类型。
+ ///
+ /// 对象的类型。
+ /// 如果此实例可以转换指定的对象类型,则为:true,否则为:false
+ public override bool CanConvert(Type objectType)
+ {
+ var typecode = Type.GetTypeCode(objectType.Name.Equals("Nullable`1") ? objectType.GetGenericArguments().First() : objectType);
+ switch (typecode)
+ {
+ case TypeCode.Decimal:
+ return (_ship & NumberConverterShip.Decimal) == NumberConverterShip.Decimal;
+ case TypeCode.Double:
+ return (_ship & NumberConverterShip.Double) == NumberConverterShip.Double;
+ case TypeCode.Int64:
+ return (_ship & NumberConverterShip.Int64) == NumberConverterShip.Int64;
+ case TypeCode.UInt64:
+ return (_ship & NumberConverterShip.UInt64) == NumberConverterShip.UInt64;
+ case TypeCode.Single:
+ return (_ship & NumberConverterShip.Single) == NumberConverterShip.Single;
+ default: return false;
+ }
+ }
+
+ ///
+ ///
+ /// 读取对象的JSON表示。
+ ///
+ /// 从 中读取。
+ /// 对象的类型。
+ /// 正在读取的对象的现有值。
+ /// 调用的序列化器实例。
+ /// 对象值。
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ return AsType(reader.Value.ToString(), objectType);
+ }
+
+ ///
+ /// 字符串格式数据转其他类型数据
+ ///
+ /// 输入的字符串
+ /// 目标格式
+ /// 转换结果
+ public static object AsType(string input, Type destinationType)
+ {
+ try
+ {
+ var converter = TypeDescriptor.GetConverter(destinationType);
+ if (converter.CanConvertFrom(typeof(string)))
+ {
+ return converter.ConvertFrom(null, null, input);
+ }
+
+ converter = TypeDescriptor.GetConverter(typeof(string));
+ if (converter.CanConvertTo(destinationType))
+ {
+ return converter.ConvertTo(null, null, input, destinationType);
+ }
+ }
+ catch
+ {
+ return null;
+ }
+ return null;
+ }
+
+ ///
+ ///
+ /// 写入对象的JSON表示形式。
+ ///
+ /// 要写入的 。
+ /// 要写入对象值
+ /// 调用的序列化器实例。
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ if (value == null)
+ {
+ writer.WriteNull();
+ }
+ else
+ {
+ var objectType = value.GetType();
+ var typeCode = Type.GetTypeCode(objectType.Name.Equals("Nullable`1") ? objectType.GetGenericArguments().First() : objectType);
+ switch (typeCode)
+ {
+ case TypeCode.Decimal:
+ writer.WriteValue(((decimal)value).ToString("f6"));
+ break;
+ case TypeCode.Double:
+ writer.WriteValue(((double)value).ToString("f4"));
+ break;
+ case TypeCode.Single:
+ writer.WriteValue(((float)value).ToString("f2"));
+ break;
+ default:
+ writer.WriteValue(value.ToString());
+ break;
+ }
+ }
+ }
+ }
+
+ ///
+ /// 转换成字符串的类型
+ ///
+ [Flags]
+ public enum NumberConverterShip
+ {
+ ///
+ /// 长整数
+ ///
+ Int64 = 1,
+
+ ///
+ /// 无符号长整数
+ ///
+ UInt64 = 2,
+
+ ///
+ /// 浮点数
+ ///
+ Single = 4,
+
+ ///
+ /// 双精度浮点数
+ ///
+ Double = 8,
+
+ ///
+ /// 大数字
+ ///
+ Decimal =16
+ }
+}
diff --git a/Blog.Core.Common/Seed/DBSeed.cs b/Blog.Core.Common/Seed/DBSeed.cs
index 7b59410..fb13768 100644
--- a/Blog.Core.Common/Seed/DBSeed.cs
+++ b/Blog.Core.Common/Seed/DBSeed.cs
@@ -109,7 +109,7 @@ namespace Blog.Core.Common.Seed
if (!myContext.Db.DbMaintenance.IsAnyTable(t.Name))
{
Console.WriteLine(t.Name);
- myContext.Db.CodeFirst.InitTables(t);
+ myContext.Db.CodeFirst.SplitTables().InitTables(t);
}
});
ConsoleHelper.WriteSuccessLine($"Tables created successfully!");
diff --git a/Blog.Core.IServices/BASE/IBaseServices.cs b/Blog.Core.IServices/BASE/IBaseServices.cs
index 7856f8b..4091b97 100644
--- a/Blog.Core.IServices/BASE/IBaseServices.cs
+++ b/Blog.Core.IServices/BASE/IBaseServices.cs
@@ -23,7 +23,7 @@ namespace Blog.Core.IServices.BASE
Task DeleteById(object id);
Task Delete(TEntity model);
-
+
Task DeleteByIds(object[] ids);
Task Update(TEntity model);
@@ -59,6 +59,14 @@ namespace Blog.Core.IServices.BASE
Expression> selectExpression,
Expression> whereLambda = null) where T : class, new();
Task> QueryPage(PaginationModel pagination);
+
+ #region 分表
+ Task QueryByIdSplit(object objId);
+ Task> AddSplit(TEntity entity);
+ Task DeleteSplit(TEntity entity, DateTime dateTime);
+ Task UpdateSplit(TEntity entity, DateTime dateTime);
+ Task> QueryPageSplit(Expression> whereExpression, DateTime beginTime, DateTime endTime, int pageIndex = 1, int pageSize = 20, string orderByFields = null);
+ #endregion
}
}
diff --git a/Blog.Core.IServices/ISplitDemoServices.cs b/Blog.Core.IServices/ISplitDemoServices.cs
new file mode 100644
index 0000000..5521576
--- /dev/null
+++ b/Blog.Core.IServices/ISplitDemoServices.cs
@@ -0,0 +1,15 @@
+
+
+using Blog.Core.IServices.BASE;
+using Blog.Core.Model.Models;
+using System.Threading.Tasks;
+
+namespace Blog.Core.IServices
+{
+ ///
+ /// sysUserInfoServices
+ ///
+ public interface ISplitDemoServices : IBaseServices
+ {
+ }
+}
diff --git a/Blog.Core.Model/Models/SplitDemo.cs b/Blog.Core.Model/Models/SplitDemo.cs
new file mode 100644
index 0000000..2632993
--- /dev/null
+++ b/Blog.Core.Model/Models/SplitDemo.cs
@@ -0,0 +1,27 @@
+using Newtonsoft.Json;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Text.Json.Serialization;
+using System.Threading.Tasks;
+
+namespace Blog.Core.Model.Models
+{
+ [SplitTable(SplitType.Day)]//按年分表 (自带分表支持 年、季、月、周、日)
+ [SugarTable("SplitDemo_{year}{month}{day}")]//3个变量必须要有,这么设计为了兼容开始按年,后面改成按月、按日
+ public class SplitDemo
+ {
+ [SugarColumn(IsPrimaryKey = true)]
+ public long Id { get; set; }
+
+ public string Name { get; set; }
+
+ [SugarColumn(IsNullable = true)]//设置为可空字段 (更多用法看文档 迁移)
+ public DateTime UpdateTime { get; set; }
+
+ [SplitField] //分表字段 在插入的时候会根据这个字段插入哪个表,在更新删除的时候用这个字段找出相关表
+ public DateTime CreateTime { get; set; }
+ }
+}
diff --git a/Blog.Core.Repository/BASE/BaseRepository.cs b/Blog.Core.Repository/BASE/BaseRepository.cs
index 828f950..3048baa 100644
--- a/Blog.Core.Repository/BASE/BaseRepository.cs
+++ b/Blog.Core.Repository/BASE/BaseRepository.cs
@@ -5,6 +5,7 @@ using Blog.Core.Model;
using Blog.Core.Model.Models;
using Blog.Core.Model.Tenants;
using Blog.Core.Repository.UnitOfWorks;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using SqlSugar;
using System;
using System.Collections.Generic;
@@ -127,7 +128,6 @@ namespace Blog.Core.Repository.Base
return await insert.ExecuteReturnIdentityAsync();
}
-
///
/// 写入实体数据
///
@@ -557,5 +557,75 @@ namespace Blog.Core.Repository.Base
// groupName = s.groupName,
// jobName = s.jobName
// }, exp, s => new { s.uID, s.uRealName, s.groupName, s.jobName }, model.currentPage, model.pageSize, model.orderField + " " + model.orderType);
+ #region Split分表基础接口 (基础CRUD)
+ ///
+ /// 分页查询[使用版本,其他分页未测试]
+ ///
+ /// 条件表达式
+ /// 页码(下标0)
+ /// 页大小
+ /// 排序字段,如name asc,age desc
+ ///
+ public async Task> QueryPageSplit(Expression> whereExpression, DateTime beginTime, DateTime endTime, int pageIndex = 1, int pageSize = 20, string orderByFields = null)
+ {
+ RefAsync totalCount = 0;
+ var list = await _db.Queryable().SplitTable(beginTime, endTime)
+ .OrderByIF(!string.IsNullOrEmpty(orderByFields), orderByFields)
+ .WhereIF(whereExpression != null, whereExpression)
+ .ToPageListAsync(pageIndex, pageSize, totalCount);
+ var data= new PageModel(pageIndex, totalCount, pageSize, list);
+ return data;
+ }
+ ///
+ /// 写入实体数据
+ ///
+ /// 数据实体
+ ///
+ public async Task> AddSplit(TEntity entity)
+ {
+ var insert = _db.Insertable(entity).SplitTable();
+ //插入并返回雪花ID并且自动赋值ID
+ return await insert.ExecuteReturnSnowflakeIdListAsync();
+ }
+
+ ///
+ /// 更新实体数据
+ ///
+ /// 数据实体
+ ///
+ public async Task UpdateSplit(TEntity entity, DateTime dateTime)
+ {
+ //直接根据实体集合更新 (全自动 找表更新)
+ //return await _db.Updateable(entity).SplitTable().ExecuteCommandAsync();//,SplitTable不能少
+
+ //精准找单个表
+ var tableName = _db.SplitHelper().GetTableName(dateTime);//根据时间获取表名
+ return await _db.Updateable(entity).AS(tableName).ExecuteCommandHasChangeAsync();
+ }
+ ///
+ /// 删除数据
+ ///
+ ///
+ ///
+ ///
+ public async Task DeleteSplit(TEntity entity,DateTime dateTime)
+ {
+ ////直接根据实体集合删除 (全自动 找表插入),返回受影响数
+ //return await _db.Deleteable(entity).SplitTable().ExecuteCommandAsync();//,SplitTable不能少
+
+ //精准找单个表
+ var tableName = _db.SplitHelper().GetTableName(dateTime);//根据时间获取表名
+ return await _db.Deleteable().AS(tableName).Where(entity).ExecuteCommandHasChangeAsync();
+ }
+ ///
+ /// 根据ID查找数据
+ ///
+ ///
+ ///
+ public async Task QueryByIdSplit(object objId)
+ {
+ return await _db.Queryable().In(objId).SplitTable(tabs => tabs).SingleAsync();
+ }
+ #endregion
}
}
\ No newline at end of file
diff --git a/Blog.Core.Repository/BASE/IBaseRepository.cs b/Blog.Core.Repository/BASE/IBaseRepository.cs
index 2978350..5f70a4b 100644
--- a/Blog.Core.Repository/BASE/IBaseRepository.cs
+++ b/Blog.Core.Repository/BASE/IBaseRepository.cs
@@ -208,5 +208,45 @@ namespace Blog.Core.IRepository.Base
int pageIndex = 1,
int pageSize = 20,
string orderByFields = null);
+
+ #region 分表
+ ///
+ /// 通过ID查询
+ ///
+ ///
+ ///
+ Task QueryByIdSplit(object objId);
+ ///
+ /// 自动分表插入
+ ///
+ ///
+ ///
+ Task> AddSplit(TEntity entity);
+ ///
+ /// 删除
+ ///
+ ///
+ ///
+ ///
+ Task DeleteSplit(TEntity entity, DateTime dateTime);
+ ///
+ /// 更新
+ ///
+ ///
+ ///
+ ///
+ Task UpdateSplit(TEntity entity, DateTime dateTime);
+ ///
+ /// 分页查询
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ Task> QueryPageSplit(Expression> whereExpression, DateTime beginTime, DateTime endTime, int pageIndex = 1, int pageSize = 20, string orderByFields = null);
+ #endregion
}
}
diff --git a/Blog.Core.Services/BASE/BaseServices.cs b/Blog.Core.Services/BASE/BaseServices.cs
index f810516..7ee55eb 100644
--- a/Blog.Core.Services/BASE/BaseServices.cs
+++ b/Blog.Core.Services/BASE/BaseServices.cs
@@ -332,5 +332,36 @@ namespace Blog.Core.Services.BASE
var express = DynamicLinqFactory.CreateLambda(pagination.Conditions);
return await QueryPage(express, pagination.PageIndex, pagination.PageSize, pagination.OrderByFileds);
}
+ #region 分表
+ public async Task> AddSplit(TEntity entity)
+ {
+ return await BaseDal.AddSplit(entity);
+ }
+ public async Task UpdateSplit(TEntity entity, DateTime dateTime)
+ {
+ return await BaseDal.UpdateSplit(entity, dateTime);
+ }
+
+ ///
+ /// 根据实体删除一条数据
+ ///
+ /// 博文实体类
+ ///
+ public async Task DeleteSplit(TEntity entity, DateTime dateTime)
+ {
+ return await BaseDal.DeleteSplit(entity, dateTime);
+ }
+
+ public async Task QueryByIdSplit(object objId)
+ {
+ return await BaseDal.QueryByIdSplit(objId);
+ }
+ public async Task> QueryPageSplit(Expression> whereExpression, DateTime beginTime, DateTime endTime,
+ int pageIndex = 1, int pageSize = 20, string orderByFields = null)
+ {
+ return await BaseDal.QueryPageSplit(whereExpression, beginTime, endTime,
+ pageIndex, pageSize, orderByFields);
+ }
+ #endregion
}
}
\ No newline at end of file
diff --git a/Blog.Core.Services/SplitDemoServices.cs b/Blog.Core.Services/SplitDemoServices.cs
new file mode 100644
index 0000000..cf8e2cc
--- /dev/null
+++ b/Blog.Core.Services/SplitDemoServices.cs
@@ -0,0 +1,23 @@
+using Blog.Core.IRepository.Base;
+using Blog.Core.IServices;
+using Blog.Core.Model.Models;
+using Blog.Core.Services.BASE;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Blog.Core.FrameWork.Services
+{
+ ///
+ /// sysUserInfoServices
+ ///
+ public class SplitDemoServices : BaseServices, ISplitDemoServices
+ {
+ private readonly IBaseRepository _splitDemoRepository;
+ public SplitDemoServices(IBaseRepository splitDemoRepository)
+ {
+ _splitDemoRepository = splitDemoRepository;
+ }
+
+
+ }
+}