我有以下代码:
public class Header
{
Line Lines { get { ...}}
public ICryptographer GetCryptographer(FieldGroup group)
{
...
}
}
public class Line
{
public Header Header { get; set; }
public FieldGroup FieldGroup { get; set; }
ICryptographer CryptoGrapher { get { return Header.GetCryptographer(FieldGroup); } }
public decimal? Month1
{
get { return _month1; }
set
{
if (_month1 != value)
Month1_Enc = CryptoGrapher.Encrypt(_month1 = value);
}
}
private decimal? _month1;
protected byte[] Month1_Enc { get; set; }
//The same repeated for Month2 to Month12
}
public interface ICryptographer
{
byte[] Encrypt(decimal? value);
decimal? DecryptDecimal(byte[] value);
}
public enum FieldGroup
{
...
}
短期属性Month1到Month12的类型是十进制?应该在保存到数据库之前加密。 我还有其他一些具有加密属性的类。每个属性代码看起来与我在这里展示的Month1完全相同。
理想情况下,我想要这样的事情:
Encrypted<decimal?> Month1 { get; set;}
但这是不可能的,因为每个对象可能有不同的Cryptographer(对称密钥)。
有没有办法重构它以避免这种可重复的代码?
我应该关心这种重复吗?
答案 0 :(得分:0)
因此,对于每个加密,你需要一个父母的引用,我是对的吗?
所以我的第一次尝试是尝试首先获取对Encrypted的每次使用的父级引用。我认为轻量级接口适合这种工作:
public interface IHasEncryptedProperties
{
string GetKey();
}
然后在类上实现它们而不是需要加密属性
public class Line : IHasEncryptedProperties
{
public string GetKey() { /* return instance-specific key; */ }
}
然后在加密时,您需要传入父实例。
public class Encrypted<T>
{
private IHasEncryptedProperties _parent;
public Encrypted(IHasEncryptedProperties parent)
{
_parent = parent;
}
public T Value
{
get
{
var encryptor = GetEncryptor(_parent.GetKey());
// encrypt and return the value
}
}
}
...
希望这会有所帮助。如果没有,请发表评论。