汽车属性?不,我不会,但在单例上使用二传手,是的,我做到了。我认为你想要对它进行更多的控制,而不是自动属性给你的。
...这里非常欢迎有建设性的反馈。在这家受人尊敬的公司中,这感觉像是一个勇敢(或愚蠢)的举动......
我的场景,一个 WPF 应用程序,它有一个可以加载和保存的当前项目。当前项目设置在整个应用程序中使用...
- 在 UI 中的 WPF 绑定中,因此用户可以更改设置,因此
INotifyPropertyChanged 界面。
- 我也使用Fody.PropertyChanged,但它不会更改静态属性,因此
NotifyStaticPropertyChanged。
-
INotifyPropertyChanged 可以很好地与单例属性上的 WPF 绑定配合使用。
-
Settings 的一个实例是使用 JSON.NET [de] 序列化的,因此单例上的 [JsonIgnore] 属性。我在将其加载到单例或将其保存到磁盘之前对其进行验证。
- 记录器是Serilog。你记录东西,对吧?
- 单例是带有
public getter 的public,因为WPF 绑定仅适用于公共属性。 internal 设置器不会影响它。 Settings 的所有属性对于 WPF 绑定都是公开的。
我在代码中留下了所有“噪音”,因为有些人可能会觉得它很有用。
class Settings : INotifyPropertyChanged
{
private static Settings _currentSettings = new Settings();
/// <summary> The one and only Current Settings that is the current Project. </summary>
[JsonIgnore] // so it isn't serialized by JSON.NET
public static Settings CurrentSettings // http://csharpindepth.com/Articles/General/Singleton.aspx
{
get { return _currentSettings; }
// setter is to load new settings into the current settings (using JSON.NET). Hey, it works. Probably not thread-safe.
internal set
{
Log.Verbose("CurrentSettings was reset. Project Name: {projectName}", value.ProjectName);
_currentSettings = value;
_currentSettings.IsChanged = false;
NotifyStaticPropertyChanged("CurrentSettings");
}
}
// http://10rem.net/blog/2011/11/29/wpf-45-binding-and-change-notification-for-static-properties
/// <summary> Fires when the Curent CurrentTvCadSettings is loaded with new settings
/// Event queue for all listeners interested in StaticPropertyChanged events. </summary>
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged = delegate { };
private static void NotifyStaticPropertyChanged(string propertyName)
{
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
}
// various instance properties including ....
public string ProjectName {get; set;}
[JsonIgnore]
public bool IsChanged { get; set; }
}
用于将单例设置为新加载的项目,settings 很简单
Settings settings = new Settings();
// load, save, deserialize, set properties, go nuts
Settings.CurrentSettings = settings;
setter 可能不是线程安全的,但我只将它设置在 UI 线程的一个地方,所以我并不害怕。您可以按照http://csharpindepth.com/Articles/General/Singleton.aspx 的受人尊敬的建议使其线程安全
我意识到 OP 没有询问 WPF,但我认为这与说明您可能想要设置单例的原因有关。我这样做是因为它是最简单的解决方案。