带时间戳的对象修改设计模式

时间:2013-08-26 14:03:45

标签: c# design-patterns timestamp

我有一个对象的集合,需要为最后一次更新对象中的某些属性(每个属性一个时间戳)维护几个时间戳。

我只是在setter中实现时间戳更新,除了首先使用的反序列化库创建一个对象,然后更新它的所有属性(使用对象的setter)。这意味着每次我的程序反序列化时,我的所有时间戳都将失效。

我想我需要一个单例类或一些更新方法来处理更新属性并控制时间戳更新。有没有更好的方法来实现这种行为?这种行为是否存在设计模式?

1 个答案:

答案 0 :(得分:2)

如果您将序列化问题与业务层分开,那么它应该可以帮助您找到解决方案的灵活性。让99%的API与您的业务对象一起工作(在更新属性时更新时间戳),然后仅转换为/从某些数据传输对象(DTO)转换为序列化目的

例如,给定一些 business 对象:

public class MyObject
{
    public DateTime SomeValueUpdated { get; private set; }

    private double _SomeValue;
    public double SomeValue
    {
        get
        {
            return _SomeValue;
        }
        set
        {
            SomeValueUpdated = DateTime.Now;
            _SomeValue = value;
        }
    }

    public MyObject()
    {

    }

    //for deserialization purposes only
    public MyObject(double someValue, DateTime someValueUpdated)
    {
        this.SomeValue = someValue;
        this.SomeValueUpdated = someValueUpdated;
    }
}

您可以像这样匹配DTO:

public class MyObjectDTO
{
    public DateTime SomeValueUpdated { get; set; }
    public double SomeValue { get; set; }
}

您的DTO可以使用各种XML架构更改属性进行特殊装饰,或者您可以管理您认为合适的时间戳,而您的业务层不知道并且不关心。

当需要序列化或反序列化对象时,请通过转换器实用程序运行它们:

public static class MyObjectDTOConverter
{
    public static MyObjectDTO ToSerializable(MyObject myObj)
    {
        return new MyObjectDTO {
            SomeValue = myObj.SomeValue,
            SomeValueUpdated = myObj.SomeValueUpdated
        };
    }

    public static MyObject FromSerializable(MyObjectDTO myObjSerialized)
    {
        return new MyObject(
            myObjSerialized.SomeValue, 
            myObjSerialized.SomeValueUpdated
        );
    }
}

如果您愿意,可以将MyObject的任何属性或构造函数设为internal,以便只有您的转换实用程序才能访问它们。 (例如,您可能不想公开访问public MyObject(double someValue, DateTime someValueUpdated)构造函数)