惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
N
Netflix TechBlog - Medium
Vercel News
Vercel News
F
Fortinet All Blogs
量子位
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
MongoDB | Blog
MongoDB | Blog
Y
Y Combinator Blog
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
H
Help Net Security
阮一峰的网络日志
阮一峰的网络日志
D
Docker
WordPress大学
WordPress大学

博客园 - henry

Smark.Net.Tcp.XmlService性能测试程序 基于Flex的http简易文件管理工具 性能的瓶颈到底在那呢? 运用Smark.SocketAsyncs扩展基于XML的TCP服务 运用Smark.SocketAsyncs方便实现数据交互服务 实现分布式对象锁 发布一个C#实现的Asterisk的管理系统 asterisk使用SIP相互对接 开源一个基于Flex4+C#的个人信息管理程序 FlashBuilder4试用 这样的重构是否有必要呢? Asterisk2B用户管理逻辑设计 用JQuery UI dialog实现Alert和Confirm功能 - henry Asterisk发起电话预约回拔 WOW工会DKP管理系统 我的分页控件设计 实现一个JavaScript验证的Asp.net Helper - henry - 博客园 Smark.Data实体成员数据验证 Smark.Data Part1
Smark.Data 实体属性值描述
henry · 2009-09-17 · via 博客园 - henry
 

       在实际应用中很多时候当属性没有值的情况下,在插入数据库时都希望设置一个默认值。Smark.Data提供属性默认值描述功能,开发人员可以拿Smark.Data内置的对象来描述属性默认值或者根据自己的需要实现默认值描述对象。

定义基础描述类

    [AttributeUsage(AttributeTargets.Property)]

    public abstract class ValueAttribute:Attribute

    {

        public ValueAttribute(bool afterupdate)

        {

            AfterByUpdate = afterupdate;  

        }

        public bool AfterByUpdate

        {

            get;

            set;

        }

        public virtual void Executing(IConnectinContext cc,object data,PropertyMapper pm,string table)

        {

        }

        public virtual void Executed(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

        }

    }

描述类有两个方法就是数据添加之前和之后;组件会根据AfterByUpdate来确定执行那个方法。基础功能描述出来那扩展描述器就方便了。

    [AttributeUsage(AttributeTargets.Property)]

    public class UID:ValueAttribute

    {

        public UID() : base(false) { }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            string uid = Guid.NewGuid().ToString("N");

            pm.Handler.Set(data, uid);

        }

    }

    [AttributeUsage(AttributeTargets.Property)]

    public class NowDate:ValueAttribute

    {

        public NowDate() : base(false) { }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            pm.Handler.Set(data, DateTime.Now);

        }

    }

    [AttributeUsage(AttributeTargets.Property)]

    public class DefaultInt : ValueAttribute

    {

        private int mValue = 0;

        public DefaultInt(int value) : base(false) {

            mValue = value;

        }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            pm.Handler.Set(data, mValue);

        }

    }

    [AttributeUsage(AttributeTargets.Property)]

    public class DefaultDecimal : ValueAttribute

    {

        private decimal mValue = 0;

        public DefaultDecimal(decimal value)

            : base(false)

        {

            mValue = value;

        }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            pm.Handler.Set(data, mValue);

        }

    }

    [AttributeUsage(AttributeTargets.Property)]

    public class DefaultString : ValueAttribute

    {

        private string mValue = "";

        public DefaultString(string value)

            : base(false)

        {

            mValue = value;

        }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            pm.Handler.Set(data, mValue);

        }

    }

    [AttributeUsage(AttributeTargets.Property)]

    public class DefaultDate:ValueAttribute

    {

        private DateTime mValue = DateTime.MinValue;

        public DefaultDate(string value)

            : base(false)

        {

            mValue =DateTime.Parse(value);

        }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            pm.Handler.Set(data, mValue);

        }

    }

    [AttributeUsage(AttributeTargets.Property)]

    public class Enabled : ValueAttribute

    {

        public Enabled() : base(false) { }

        public override void Executing(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            pm.Handler.Set(data, true);

        }

    }

除了简单的描述外,还可以通过操作数据库来进行值设置;我们用MSSQL是不是有递增值吗,那可以写个值描述器来设置新添加成员的ID

    [AttributeUsage(AttributeTargets.Property)]

    public class IDENTITY : ValueAttribute

    {

        public IDENTITY()

            : base(true)

        {

        }

        public override void Executed(IConnectinContext cc, object data, PropertyMapper pm, string table)

        {

            Command cmd = new Command("select @@IDENTITY ");

            object value = cc.ExecuteScalar(cmd);

            pm.Handler.Set(data,Convert.ChangeType( value,pm.Handler.Property.PropertyType));

        }

    }

对于使用也比较简单方便:

    [Table]

    interface IUser

    {

        [ID]

        [UID]

        string UserID { get; set; }

        [Column]

        [NotNull("帐号名称不能为空!")]

        [Unique("相同帐号名称已经存!")]

        string UserName { get; set; }

        [Column]

        [PWDCrypto]

        string UserPWD { get; set; }

        [Column]

        [NotNull("邮件地址不能为空!")]

        [Unique("邮件地址已经被其他帐号所使用!")]

        string EMail { get; set; }

        [Column]

        [NowDate]

        DateTime CreateDate { get; set; }

        [Column]

        [EnumToString]

        [DefaultEnum]

        UserType Type { get; set; }

    }