如果只有一个属性发生更改,则不会触发.Net C#中自定义类的单例设置程序

本文关键字:自定义 Net 程序 设置 单例 属性 有一个 如果 | 更新日期: 2023-09-27 17:59:45

我有这个类

 public class SPP {
    static PPModel PP= null;
    public PPModel sPP
    {
        set
        {
            if (PP != value)
            {
               PP = value;
               //save PP in database
            }
        }
        get
        {
            if (PP == null)
            {
                //lazy loading of PP
            }
            return PP;
        }
    }
}
public class PPModel
{
    public string property1 { get; set; }
    public int property2 { get; set; }
    public int property3 { get; set; }
    public int property4 { get; set; }
    public Dictionary<string, int> property5 { get; set; }
}

现在,如果我以这种方式设置sPP,一切都很好:

SSP.Instance.sPP = new PPModel(){...};

但我想知道是否有可能只更新这个singleton的一个属性并以这种方式触发setter:

SSP.Instance.sPP.property4 = 7;

如果我这样做,singleton sPP有更新的值,但setter似乎没有被触发,这意味着像数据库保存这样的额外代码将不起作用。

有机会让它发挥作用吗?

提前谢谢。

如果只有一个属性发生更改,则不会触发.Net C#中自定义类的单例设置程序

一个很好的解决方案是将模型更改为具有完整的属性定义,并在setter上调用DB更新,例如:

public class PPModel
{
    private string _fieldOne;
    public string Property1
    {
        get { return _fieldOne; }
        set
        {
            _fieldOne = value;
            // update DB
        }
    }
    private int _field2;
    public int Property2
    {
        get { return _field2; }
        set
        {
            _field2 = value;
            // update DB
        }
    }
    // and so on for all properties
}

您不能通过更新内部存储对象属性来触发单例中的setter。

你可以这样触发你的设置:

SSP.Instance.sPP = new PPModel(){...};
var instance = SSP.Instance.sPP;
instance.property4 = 7
SSP.Instance = instance;

通过这种方式,您将重置实例的确切变量并触发更新。

但是,当您实现singleton时,它不负责执行与它存储的对象相关的操作。您必须监视PPModel对象中的更改,因为只有这个类负责它的内部状态。