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

推荐订阅源

S
Secure Thoughts
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
GbyAI
GbyAI
L
LINUX DO - 最新话题
A
Arctic Wolf
T
Tor Project blog
G
GRAHAM CLULEY
I
InfoQ
博客园_首页
IT之家
IT之家
The Register - Security
The Register - Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
K
Kaspersky official blog
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
U
Unit 42
PCI Perspectives
PCI Perspectives
量子位
P
Palo Alto Networks Blog
S
Securelist
T
Troy Hunt's Blog
博客园 - 【当耐特】
Recorded Future
Recorded Future
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
博客园 - 聂微东
罗磊的独立博客
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
NISL@THU
NISL@THU
C
Cisco Blogs
T
Threatpost
有赞技术团队
有赞技术团队
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
T
The Exploit Database - CXSecurity.com
Cloudbric
Cloudbric
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - 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; }

    }