Smark.Data 值转换器

        组件支持属性转换描述,主要用于对象属性值和数据存储之前的转换,如常见的枚举和数值,枚举和字符,用户密码等信息转换存储。实际上也可以扩展更灵活的转换如对象关联字段转换,对象序列化转等等。

        在Smark.Data描述一个转换器是一件很简单的事情,只需要继承PropertyCastAttribute对象并重写两个方法即可,以下是一个简单的枚举和数值的数值转换

    public class EnumToInt : PropertyCastAttribute
    {
        public override object ToColumn(object value, Type ptype, object source)
        {
            return (int)value;
        }
        public override object ToProperty(object value, Type ptype, object source)
        {
            return (Status)value;
        }
    }
    public enum Status : int
    {
        Default,
        Yes,
        No
    }

        也可以针对需来实现一个枚举和字符的转换

    public class EnumToString : PropertyCastAttribute
    {
        public override object ToColumn(object value, Type ptype, object source)
        {
            return value.ToString();
        }
        public override object ToProperty(object value, Type ptype, object source)
        {
            return Enum.Parse(ptype, (string)value);
        }
    }

        PropertyCastAttribute的两个方法分别是描述到字段是值和到属性的值处理描述,这样的话就可以做对应的转换工作;以下是实现一个基于BlowFish加解密的密码存储转换。

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Struct)]
    public class StringCrypto : PropertyCastAttribute
    {
        public static string BlowfishKey="sdfsdfsd1213lkjl";
   
        private BlowFishCS.BlowFish mBlowfish;
        public StringCrypto()
        {
            mBlowfish = new BlowFishCS.BlowFish(BlowfishKey);
        }
        public StringCrypto(string key)
        {
            mBlowfish = new BlowFishCS.BlowFish(key);
        }

        public override object ToProperty(object value, Type ptype, object source)
        {

            return DecryptString((string)value);
        }

        public override object ToColumn(object value, Type ptype, object source)
        {

            return EncryptString((string)value);
        }
        public string EncryptString(string value)
        {
            if (string.IsNullOrEmpty(value))
                return value;
            return mBlowfish.Encrypt_CTR(value);
        }
        public string DecryptString(string value)
        {
            if (string.IsNullOrEmpty(value))
                return value;
            return mBlowfish.Decrypt_CTR(value);
        }
    }

        转换器实现后就可以通过属性的方式描述到实体成员中使用

    [Table]
    public interface ITest 
    {
        [UID]
        [ID]
        String ID { get; set; }
        [EnumToInt]
        [Column("ENUM_INT")]
        Status IntValue { get; set; }
        [Column("ENUM_STRING")]
        [EnumToString]
        Status StringValue { get; set; }
        [StringCrypto]
        [Column]
        string PassWord { get; set; }
    }

        直接创建对象设置值就能保存

    Test test = new Test();
    test.IntValue = Status.Yes;
    test.StringValue = Status.No;
    test.PassWord = "123456";
    DBContext.Save(test);

        数据保存数据的结果

    在制定转换器后也会自动应用到查询条件上

    (Test.intValue == new Status[] {Status.Default,Status.No }).Delete<Test>();

    Smark.Data 开源数据访问组件 Apache License 2.0 (Apache)

 

 

posted @ 2012-08-28 17:11  beetlex  阅读(1194)  评论(2编辑  收藏  举报