数据访问的简约设计
https://github.com/bigmouthz/SevenArmsSeries.Repositories
1 public class Request 2 { 3 /// <summary> 4 /// 请求主体或标识约定 5 /// </summary> 6 public string Guid { get; set; } 7 8 /// <summary> 9 /// 查询条件 对应于系统后台实现规则 10 /// </summary> 11 public IList<RequestParameter> Params { get; set; } 12 }
1 public class RequestParameter 2 { 3 public string Name { get; set; } 4 5 public string Value { get; set; } 6 7 public string Type { get; set; } 8 }
1 /// <summary> 2 /// 命令执行请求 3 /// </summary> 4 public class CommandRequest : Request 5 { 6 /// <summary> 7 /// 返回值类型:true:返回任意类型,false:Int类型 8 /// </summary> 9 public bool TrueScalar_FalseIntByResult { get; set; } 10 11 }
1 /// <summary> 2 /// 命令执行返回值 3 /// </summary> 4 public class CommandResponse 5 { 6 /// <summary> 7 /// 返回值 8 /// </summary> 9 public object ResultValue { get; set; } 10 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 存储-返回对象 3 /// </summary> 4 public class RepositoryResponse 5 { 6 /// <summary> 7 /// 执行有无成功 8 /// </summary> 9 public bool ResultState { get; set; } 10 11 /// <summary> 12 /// 返回执行纪录情况 13 /// </summary> 14 public string MessageString 15 { 16 get 17 { 18 StringBuilder sb = new StringBuilder(); 19 if (CreateMessage != null && CreateMessage.Count > 0) 20 { 21 sb.AppendLine("Create:"); 22 foreach (var m in CreateMessage) 23 { 24 sb.AppendFormat("{0},{1} ", m.Key, m.Value).AppendLine(); 25 } 26 } 27 if (UpdateMessage != null && UpdateMessage.Count > 0) 28 { 29 sb.AppendLine("Update:"); 30 foreach (var m in UpdateMessage) 31 { 32 sb.AppendFormat("{0},{1} ", m.Key, m.Value).AppendLine(); 33 } 34 } 35 if (RemoveMessage != null && RemoveMessage.Count > 0) 36 { 37 sb.AppendLine("Remove:"); 38 foreach (var m in RemoveMessage) 39 { 40 sb.AppendFormat("{0},{1} ", m.Key, m.Value).AppendLine(); 41 } 42 } 43 return sb.ToString(); 44 } 45 } 46 47 /// <summary> 48 /// 执行情况-新增 49 /// </summary> 50 public Dictionary<string, string> CreateMessage { get; set; } 51 52 /// <summary> 53 /// 执行情况-修改 54 /// </summary> 55 public Dictionary<string, string> UpdateMessage { get; set; } 56 57 /// <summary> 58 /// 执行情况-删除 59 /// </summary> 60 public Dictionary<string, string> RemoveMessage { get; set; } 61 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 存储-请求对象 3 /// </summary> 4 /// <typeparam name="TKey"></typeparam> 5 /// <typeparam name="TEntity"></typeparam> 6 public class RepositoryRequest<TKey, TEntity>:Request 7 { 8 /// <summary> 9 /// 新增实体集 10 /// </summary> 11 public List<TEntity> CreateEntities { get; set; } 12 13 /// <summary> 14 /// 修改实体集 15 /// </summary> 16 public List<TEntity> UpdateEntities { get; set; } 17 18 /// <summary> 19 /// 删除实体集 20 /// </summary> 21 public List<TKey> RemoveEntities { get; set; } 22 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 单记录查询请求对象 3 /// </summary> 4 public class QueryBySingleRequest:Request 5 { 6 public static string DefaultNullParamPlus = " 1=1 "; 7 8 private string _paramPlus = string.Empty; 9 /// <summary> 10 /// 查询条件 用于复杂的查询页面,接收前台拼接好的sql语句条件 用于字符串替换默认为{0} 11 /// </summary> 12 public string ParamPlus 13 { 14 get 15 { 16 return string.IsNullOrWhiteSpace(_paramPlus) ? DefaultNullParamPlus : _paramPlus; 17 } 18 set { _paramPlus = value; } 19 } 20 21 private Dictionary<string, string> _paramSort = new Dictionary<string, string>(); 22 /// <summary> 23 /// 排序条件 关键字:排序 对应于系统后台实现规则(asc|desc), 转换后 用于字符串替换默认为{1} 24 /// </summary> 25 public Dictionary<string, string> ParamSort { get { return _paramSort; } set { _paramSort = value; } } 26 27 28 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 单记录对象返回对象 3 /// </summary> 4 /// <typeparam name="TDto"></typeparam> 5 public class QueryBySingleResponse<TDto> 6 { 7 /// <summary> 8 /// 返回的记录 9 /// </summary> 10 public TDto Row { get; set; } 11 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 多记录查询请求对象 3 /// </summary> 4 public class QueryByMoreRequest : QueryBySingleRequest 5 { 6 /// <summary> 7 /// 是否分页 8 /// </summary> 9 public bool IsPaging { get; set; } 10 11 private int _pageIndex; 12 /// <summary> 13 /// 分页情况下的,当前页面,下标为1起 14 /// </summary> 15 public int PageIndex { get { return _pageIndex <= 0 ? 1 : _pageIndex; } set { _pageIndex = value; } } 16 17 private int _pageSize; 18 /// <summary> 19 /// 分页情况下的,页面尺寸,最少为1起 20 /// </summary> 21 public int PageSize { get { return _pageSize <= 0 ? 1 : _pageSize; } set { _pageSize = value; } } 22 23 /// <summary> 24 /// 是否启用页面缓存,仅当页面缓存有效时才有用 25 /// </summary> 26 public bool IsCachePage { get; set; } 27 28 /// <summary> 29 /// 恒等于 启用分页下的当前页面(后台无意义,前台用于控制用) 30 /// </summary> 31 public int _cachePageIndex { get; set; } 32 33 /// <summary> 34 /// 缓存情况下,缓存页面数 35 /// </summary> 36 public int CahcePageCount { get; set; } 37 38 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /// <summary> 2 /// 多记录查询返回对象 3 /// </summary> 4 /// <typeparam name="TDto"></typeparam> 5 public class QueryByMoreResponse<TDto> 6 { 7 /// <summary> 8 /// 返回总记录数 9 /// </summary> 10 public int TotalRowCount { get; set; } 11 12 /// <summary> 13 /// 返回的记录集 14 /// </summary> 15 public List<TDto> Rows { get; set; } 16 }
应用实现示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using SevenArmsSeries.Repositories.RDBMS; namespace SevenArmsSeries.PassionateRing.RDBMSStoreTest { public class User:IEntity { public string Guid { get; set; } public string Code { get; set; } public string Name { get; set; } public int IsAdministrator { get; set; } #region IEntity Members public IKey GetKey() { return (IKey)new UserKey() { Guid = this.Guid }; } public List<Repositories.RDBMS.Core.SqlParams> GetSQLParams() { return new List<Repositories.RDBMS.Core.SqlParams>() { new Repositories.RDBMS.Core.SqlParams(){ ColumnName = "@Guid", Value = this.Guid, ColumnType = System.Data.DbType.String }, new Repositories.RDBMS.Core.SqlParams(){ ColumnName = "@Code", Value = this.Code, ColumnType = System.Data.DbType.String }, new Repositories.RDBMS.Core.SqlParams(){ ColumnName = "@Name", Value = this.Name, ColumnType = System.Data.DbType.String }, new Repositories.RDBMS.Core.SqlParams(){ ColumnName = "@IsAdministrator", Value = this.IsAdministrator, ColumnType = System.Data.DbType.Boolean }, }; } #endregion } public class UserKey : IKey { public string Guid { get; set; } #region IKey Members public List<Repositories.RDBMS.Core.SqlParams> GetSQLParams() { return new List<Repositories.RDBMS.Core.SqlParams>() { new Repositories.RDBMS.Core.SqlParams(){ ColumnName = "@Guid", Value = this.Guid, ColumnType = System.Data.DbType.String }, }; } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using SevenArmsSeries.Repositories; using SRRDBMS = SevenArmsSeries.Repositories.RDBMS; using SevenArmsSeries.Repositories.RDBMS; namespace SevenArmsSeries.PassionateRing.RDBMSStoreTest { public class UserHelper : IQueryBySingle<User>,IQueryByCount, IQueryByMore<User> { readonly string Flag = "SevenArmsSeries.PassionateRing.RDBMSStoreTest.User"; public UserHelper() { if (!SRRDBMS.ReposityEntityFactory.Items.ContainsKey(Flag)) { SRRDBMS.ReposityEntityFactory.Items.Add(Flag, new ReposityEntity() { OwnerService = "PassionateRing", QuerySingleEntity = @"Select [Guid],[Code],[Name],[IsAdministrator] From [PassionateRing].[dbo].[User] Where [Guid] = @Guid", CreateEntity = @"INSERT INTO [PassionateRing].[dbo].[User] ([Guid],[Code],[Name],[IsAdministrator]) VALUES (@Guid ,@Code ,@Name ,@IsAdministrator)", UpdateEntity = @"UPDATE [PassionateRing].[dbo].[User] SET [Code] = @Code ,[Name] = @Name ,[IsAdministrator] = @IsAdministrator Where [Guid] = @Guid ", RemoveEntity = @"Delete From [PassionateRing].[dbo].[User] Where [Guid] = @Guid ", QueryCountEntity = @"Select Count(*) CNT From [PassionateRing].[dbo].[User] Where 1 = 1 And {0}", QueryMoreEntity = @"Select [Guid],[Code],[Name],[IsAdministrator] From [PassionateRing].[dbo].[User] Where 1 = 1 And {0} Order By {1}", CommandEntity = @"Update [PassionateRing].[dbo].[User] SET [IsAdministrator] = @IsAdministrator Where [Guid] = @Guid ", } ); SRRDBMS.ReposityEntityFactory.Items[Flag].Add("CreateTable", @"IF NOT EXISTS (SELECT * FROM [PassionateRing].dbo.SysObjects WHERE ID = object_id(N'[User]') AND OBJECTPROPERTY(ID, 'IsTable') = 1) CREATE TABLE [PassionateRing].[dbo].[User]( [Guid] [varchar](40) COLLATE Chinese_PRC_CI_AS NOT NULL, [Code] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [Name] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [IsAdministrator] [bit] NULL, CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ( [Guid] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] "); } } public QueryBySingleResponse<User> Get(QueryBySingleRequest request) { return new QueryBySingle<User>().Get(request, SRRDBMS.ReposityEntityFactory.Items[Flag]); } public int GetCount(QueryBySingleRequest request) { return new QueryByCount().GetCount(request, SRRDBMS.ReposityEntityFactory.Items[Flag]); } public QueryByMoreResponse<User> Gets(QueryByMoreRequest request) { return new QueryByMore<User>().Gets(request, SRRDBMS.ReposityEntityFactory.Items[Flag]); } public CommandResponse ChangeUserState(CommandRequest request) { return new Command().Execute(request, SRRDBMS.ReposityEntityFactory.Items[Flag]); } public CommandResponse CreateTable(CommandRequest request) { return new Command().Execute(request, SRRDBMS.ReposityEntityFactory.Items[Flag], "CreateTable"); } public RepositoryResponse Save(RepositoryRequest<UserKey, User> request) { return new Repository<UserKey, User>().Save(request, SRRDBMS.ReposityEntityFactory.Items[Flag]); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using SevenArmsSeries.Repositories; namespace SevenArmsSeries.PassionateRing.RDBMSStoreTest { class Program { static void Main(string[] args) { UserHelper helper = new UserHelper(); var r1 = helper.CreateTable(new Repositories.CommandRequest() { TrueScalar_FalseIntByResult = false }); var r2 = helper.Save(new Repositories.RepositoryRequest<UserKey, User>() { CreateEntities = new List<User>() { new User(){ Guid = "1", Code="A", Name = "A", IsAdministrator=0}, new User(){ Guid = "2", Code="B", Name = "B", IsAdministrator=0}, new User(){ Guid = "3", Code="C", Name = "C", IsAdministrator=0}, new User(){ Guid = "4", Code="D", Name = "D", IsAdministrator=0}, }, UpdateEntities = new List<User>() { new User(){ Guid = "1", Code="A", Name = "AA", IsAdministrator=0}, new User(){ Guid = "4", Code="D", Name = "DD", IsAdministrator=0}, }, RemoveEntities = new List<UserKey>() { new UserKey(){ Guid ="2" }, new UserKey(){ Guid ="3" }, }, }); var r3 = helper.ChangeUserState(new Repositories.CommandRequest() { TrueScalar_FalseIntByResult = false, Params = new List<RequestParameter>() { new RequestParameter(){ Name = "IsAdministrator", Value ="1", Type ="bit", }, new RequestParameter(){ Name = "Guid", Value ="1", Type ="string", } }, }); var r4 = helper.Get(new QueryBySingleRequest() { Params = new List<RequestParameter>() { new RequestParameter(){ Name = "Guid", Value ="1", Type ="string", } }, }); var r5 = helper.GetCount(new QueryBySingleRequest() { ParamPlus = "1=1", ParamSort = new Dictionary<string, string>() { {"[Code]","desc"}, {"[Name]","desc"}, } }); var r6 = helper.Gets(new QueryByMoreRequest() { ParamPlus = "1=1", ParamSort = new Dictionary<string, string>() { {"[Code]","desc"}, {"[Name]","desc"}, }, }); Console.WriteLine(); } } }