• 说说底层架构之实体类的设计


    今天有点时间,来说说如何设计的实体类更加合理,灵活,规范.

    首先,那要和真实数据表一一对应,必要的话,可以对类型抽象化,可以引入枚举,泛型列表等类型;其次,对实体要集成它的数据有效性的验证功能;再次,为了数据操作方便,有必要去引入数据表字段的列举集合;综上所述,我们来设计一个用户表实体;

    本例中的知识点为:部分类,接口规范,Flag属性的枚举,迭代器等

         /// <summary>
        /// 数据实体统一接口
        /// </summary>
        public interface IDataEntity
        {
        }

         /// <summary>
        /// 用户实体
        /// </summary>
        partial class UserBase : IDataEntity
        {
            public string UserName { get; set; }
            public int Age { get; set; }
        }
         /// <summary>
        /// 实体验证类
        /// </summary>
        public class RuleViolation
        {
            /// <summary>
            /// 错误属性
            /// </summary>
            public string ErrProperty { get; private set; }
            /// <summary>
            /// 错误信息
            /// </summary>
            public string ErrMessage { get; private set; }
            public RuleViolation(string errProperty, string errMessage)
            {
                this.ErrProperty = errProperty;
                this.ErrMessage = errMessage;
            }
            public RuleViolation(string errMessage)
                : this(errMessage, null)
            {
     
            }
        }
        /// <summary>
        /// 实体验证统一接口
        /// </summary>
        public interface IEntity
        {
            /// <summary>
            /// 验证是否通过
            /// </summary>
            bool IsValid { get; }
            /// <summary>
            /// 以迭代的形式返回验证列表
            /// </summary>
            /// <returns></returns>
            IEnumerable<RuleViolation> GetRuleViolations();
        }
         /// <summary>
        /// 用户实体验证
        /// </summary>
        public partial class UserBase : IEntity
        {
     
            #region IEntity Members
     
            public bool IsValid
            {
                get { return this.GetRuleViolations().Count() == 0; }
            }
     
            public IEnumerable<RuleViolation> GetRuleViolations()
            {
                if (string.IsNullOrEmpty(this.UserName))
                    yield return new RuleViolation("UserName", "用户名为能为空");
                if (this.Age == 0)
                    yield return new RuleViolation("Age", "没有年龄为0的数据,至少为1");
            }
     
            #endregion
        }
         /// <summary>
        /// 表字段列举
        /// </summary>
        [Flags]
        public enum UserBaseColumns
        {
            UserName = 1,
            Age = 2,
        }
  • 相关阅读:
    DotNetty 实现 Modbus TCP 系列 (一) 报文类
    C# 获取文件详细备注信息 (如图片、视频实际创建时间)
    Java 下载 HLS (m3u8) 视频
    开源 DotNetty 实现的 Modbus TCP/IP 协议
    SQL Server 2008 开启远程连接
    在 Web 页面使用 VLC 插件播放 m3u8 视频流 (360 极速模式)
    在 Web 页面中使用离线地图
    使用 Travis CI 自动部署 Hexo 站点至 GitHub Pages
    BZOJ 3238: [Ahoi2013]差异((单调栈+后缀数组)/(后缀树))
    BZOJ 3998: [TJOI2015]弦论(后缀自动机)
  • 原文地址:https://www.cnblogs.com/lori/p/2094326.html
Copyright © 2020-2023  润新知