C#属性重构 - 我应该关心吗?

时间:2009-11-08 14:42:33

标签: c# refactoring

我有以下代码:

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(对称密钥)。

有没有办法重构它以避免这种可重复的代码?
我应该关心这种重复吗?

1 个答案:

答案 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
        }
    }
}

...

希望这会有所帮助。如果没有,请发表评论。