在 PHP 网络编程中,我总是制作一个单件输出对象,我可以在其中输入必须可用的全局信息代码行。
因此,在 WPF 应用程序中,我创建了以下类来执行相同的功能,例如变量 ReturnToPageIdCode
会在处理完某个任务后返回另一个页面应该返回的页面,我可以在任何地方设置并获取该值。
这很好用。
但是,我不禁认为在有状态 WPF环境中,我使用此单例输出对象重新创建方向盘。
您在哪里放置应用程序范围的值在WPF应用程序中?有没有一些标准的地方可以做到这一点?
public class Output
{
private Output output;
private static Output instance;
public string ReturnToPageIdCode { get; set; }
public static Output GetInstance()
{
if (instance == null)
{
instance = new Output();
}
return instance;
}
public string GetTestMessage()
{
return "This is a global test message from the output singleton.";
}
}
答案 0 :(得分:10)
全局?拒绝吧。 (对不起,有人不得不说)配置内容,正如其他人建议的那样,使用App.Config,你提供的代码对我来说就像M-V-VM - 你应该检查一下。 WPF,就其本质而言,促进了这一点。学习它,爱它,活它。
答案 1 :(得分:4)
我认为我认为你正在描述的那种全局状态是配置信息。结果,我将它放在App.config文件中,通常是通过项目的属性“设置”选项卡。
这将通过<WhateverNamespace>.Properties.Settings
公开您的配置信息,以便以类型安全的方式轻松访问。
如果您正在描述其他内容,例如不是配置信息的可变应用程序状态,我强烈建议将您的范例转换为更客户端应用程序形式,因为它的错误导致这种全局状态非常不受欢迎 - 性质。 IE,重构您的应用程序模型,使其不依赖于全局数据 - 改为使用参数和对象。
答案 2 :(得分:3)
App.Config(双击项目中的Properties节点)获取用户特定(读/写)和特定于应用程序(只读)的基元。
对于诸如提供者(数据库,日志记录等)之类的复杂类型,没有“一个”的地方。但今天最好的模式是使用某种形式的dependency injection,例如Unity或NInject。
答案 3 :(得分:1)
虽然我普遍缺乏对全局变量的热情,但至少应该承认全球信息的中央WPF机制:应用程序的资源字典。有很多事情你不应该使用它(比如,你可以通过在应用程序的资源字典中放入一个XML数据源来创建一个类似单一的对象,但实际上,不要这样做),但是有很多东西您应该做的事情 - 全局样式,全局模板等
答案 4 :(得分:1)
试试这个
/// <summary>
/// "Global variables" or kind of "Session State" class.
/// To save a variable: ApplicationState.SetValue("currentCustomerName", "Jim Smith");
/// To read a variable: MainText.Text = ApplicationState.GetValue<string>("currentCustomerName");
/// </summary>
public static class ApplicationData
{
/// <summary>
/// Get an application-scope resource Formatted News
/// </summary>
/// <returns></returns>
public static DataContainerModel GetNews()
{
var formattedNews = (DataContainerModel)Application.Current.Resources["FormattedNews"];
return formattedNews;
}
/// <summary>
/// Set an application-scope resource Formatted News
/// </summary>
/// <param name="dataContainerModel"></param>
public static void SetNews(DataContainerModel dataContainerModel)
{
Application.Current.Resources["FormattedNews"] = dataContainerModel;
}
private static ConcurrentDictionary<string, object> _values = new ConcurrentDictionary<string, object>();
public static void SetValue(string key, object value)
{
if (_values.ContainsKey(key))
{
var oldValue = new object();
_values.TryRemove(key, out oldValue);
}
_values.TryAdd(key, value);
}
public static T GetValue<T>(string key)
{
if (_values.ContainsKey(key))
{
return (T)_values[key];
}
else
{
return default(T);
}
}
}
所以在这里你会看到两种方法。我想同时拥有它们。
哦! DataContainerModel
将成为您需要的任何自定义类。