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)
访问Beetlex的Github

浙公网安备 33010602011771号