如果只有一个 属性 发生变化,.Net C# 中来自客户 class 的单例 Setter 不会触发
Setter of a singleton from an custome class in .Net C# not triggered if only one property changed
我有这个class
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(){...};
但我想知道是否可以仅更新此单例中的一个 属性 并以这种方式触发 setter:
SSP.Instance.sPP.property4 = 7;
如果我这样做,单例 sPP 具有更新的值,但是 setter 似乎没有被触发,这意味着像数据库保存这样的附加代码将不起作用。
有没有机会让这个工作?
提前致谢。
一个好的解决方案是更改模型以具有完整的属性定义,并在设置器上调用数据库更新,如下所示:
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。
您可以像这样触发您的 setter:
SSP.Instance.sPP = new PPModel(){...};
var instance = SSP.Instance.sPP;
instance.property4 = 7
SSP.Instance = instance;
这样您就可以将确切的变量重置为您的实例并触发更新。
但是,当您实现单例时,它不负责执行与其存储的对象相关的操作。
您必须监视 PPModel 对象的变化,因为只有这个 class 负责它的内部状态。
我有这个class
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(){...};
但我想知道是否可以仅更新此单例中的一个 属性 并以这种方式触发 setter:
SSP.Instance.sPP.property4 = 7;
如果我这样做,单例 sPP 具有更新的值,但是 setter 似乎没有被触发,这意味着像数据库保存这样的附加代码将不起作用。
有没有机会让这个工作?
提前致谢。
一个好的解决方案是更改模型以具有完整的属性定义,并在设置器上调用数据库更新,如下所示:
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。
您可以像这样触发您的 setter:
SSP.Instance.sPP = new PPModel(){...};
var instance = SSP.Instance.sPP;
instance.property4 = 7
SSP.Instance = instance;
这样您就可以将确切的变量重置为您的实例并触发更新。
但是,当您实现单例时,它不负责执行与其存储的对象相关的操作。 您必须监视 PPModel 对象的变化,因为只有这个 class 负责它的内部状态。