我有一个应用程序,它在用户设置中存储对象集合,并通过 ClickOnce 进行部署。应用程序的下一版本对存储的对象类型进行了修改。例如,之前版本的类型是:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
新版本的类型是:
public class Person
{
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
显然,ApplicationSettingsBase.Upgrade
不知道如何执行升级,因为 Age 需要使用 进行转换(age) => DateTime.Now.AddYears(-age)
,因此只有 Name 属性会被升级,而 DateOfBirth 将只有 Default(DateTime) 的值。
所以我想通过重写提供一个升级例程,ApplicationSettingsBase.Upgrade
它将根据需要转换值。但我遇到了三个问题:
ApplicationSettingsBase.GetPreviousVersion
,返回的值将是当前版本的对象,该对象没有 Age 属性并且具有空的 DateOfBirth 属性(因为它无法将 Age 反序列化为 DateOfBirth)。从IsolatedStorageSettings.Save方法页面的备注部分:
当关闭使用该类的应用程序时,将保存写入IsolatedStorageSettings对象的数据.当用户关闭Web浏览器,刷新页面或浏览页面时,可能会发生这种情况.如果您希望应用程序立即写入隔离存储,则可以在应用程序代码中调用Save方法.
所以,我永远不能打电话给这个Save
方法,每个设置都是安全的.我只是好奇我应该使用哪种用法Save
?
我正在 iPhone/iPad 上测试应用程序安装,但我只能执行一次,因为 iOS 会记住设置,例如允许访问照片等,并且在卸载应用程序时永远不会清除它们。因此,下次我安装它时,它不会要求允许访问照片等。
除了重置设备之外,还有什么方法可以完全删除应用程序和设置?
我不记得我在哪里看到这个,但在为我的.NET Core MVC应用程序设置应用程序配置时,我在博客上遵循了建议.我创建了这样的模型来保存我的应用程序所需的一些设置:
public class BasePathSettings
{
public string BaseImageFolder { get; set; }
public string BaseApiUrl { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的StartUp有这个......
public void ConfigureServices(IServiceCollection services)
{
...
// this adds the base paths to container
services.Configure<BasePathSettings>(Configuration.GetSection("BasePathSettings"));
....
}
Run Code Online (Sandbox Code Playgroud)
而appsettings.json中有这个:
"BasePathSettings": {
"BaseImageFolder": "D:\\Images\\",
"BaseApiUrl": "http://localhost:50321/"
},
Run Code Online (Sandbox Code Playgroud)
我注入了需要这些信息的控制器......
private readonly BasePathSettings _settings;
public ClientsController(IOptions<BasePathSettings> settings)
{
_settings = settings.Value;
_client = new HttpClient();
_client.BaseAddress = new Uri(_settings.BaseApiUrl);
}
Run Code Online (Sandbox Code Playgroud)
在我的localhost上运行它一切正常.
但是,当我将此应用程序部署到Azure时,我假设我需要在应用程序服务的常规设置中创建应用程序设置.所以我创建了一个名为BasePathSettings的应用程序设置,并将设置的json复制到值中:
{ "BaseImageFolder": "imagePath", "BaseApiUrl": "apiUrl" }
Run Code Online (Sandbox Code Playgroud)
似乎Azure barfs在ConfigureServices代码中声称web.config在NTFS中没有正确的权限.我猜测真正的罪魁祸首是如何从Azure应用程序设置中读取json值.
我甚至可以在那里使用json吗?如果是这样,它需要格式不同吗?
我有一个名为的属性,它是通过 Visual Studio 中的属性设置窗口 A
设置的值(项目 \xe2\x86\x92 属性 \xe2\x86\x92 设置)。AAA
A
我可以使用此循环获取该属性的原始值。
\n如果我更改该值,也就是说NewValue
,我可以使用以下代码获取新值:
Properties.Settings.Default.A\n
Run Code Online (Sandbox Code Playgroud)\n\n但是,在循环内,我不知道如何在不使用语法的情况下获取当前属性值:
\n\nProperties.Settings.Default.VariableName\n
Run Code Online (Sandbox Code Playgroud)\n\n例如:
\n\nProperties.Settings.Default.A= "NewValue";\nProperties.Settings.Default.Save();\nforeach (SettingsProperty _currentProperty in Properties.Settings.Default.Properties)\n{\n Console.WriteLine(_currentProperty.Name + "," + _currentProperty.DefaultValue.ToString());\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n上面的循环显示了属性的原始值(旧的默认值是AAA
)。
我已检查该user.config
文件并确保它正在显示NewValue
。
我假设必须有某种方法使用我不知道的属性或方法来引用当前值(也许我应该迭代另一个集合?)。
\n\n问题是,如何在foreach
上面的循环中显示这个新值?
假设我们有这样的 AppSettings.json
{
"Region": Europe,
"WeirdService": {
"JustField": "value"
}
}
Run Code Online (Sandbox Code Playgroud)
在单独的单例类中注册WeirdService
设置(或使用选项模式)很好,只需:
service.AddSingleton(configuration.GetSection("WeirdService").Get<WeirdService>();
Run Code Online (Sandbox Code Playgroud)
此时就可以了。然而,我不知道如何像我的示例中那样干净地处理这个顶级属性Region
。
我知道我可以直接注入IConfiguration
和使用config.GetValue<string>("Region")
或直接访问配置,但我想知道是否有一些干净、更好的方法,无需在服务中对这些东西进行硬编码。
我忘了提及。我目前合作的团队使用 .NET Core 3.1,因为它是当前的 LTS 版本。
我已经构建了一个C#程序.
我需要继续设置我的程序,我需要在程序加载时加载它们
(我知道用简单的文本文件来做...但我没有关于变量的良好文档)
最好的方法是什么?
我能得到任何样品吗?
<appSettings>
<!-- Settings file for website! -->
<add key="DefaultCookieExpiryMins" value="30" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
为什么我必须将所有内容都设置为字符串?为什么我不能在那里有不同的数据类型像int来帮助我停止投射一切?
如果我关闭应用程序,保存设置的最佳方法是什么?我知道在iOS中你可以在全局设置菜单中为你的应用程序添加Entrys.android中有类似的东西吗?或者什么是更好的解决方案?
我想知道应用程序设置是否可靠存储值?
我正在考虑将应用程序的XML文件路径存储在那里,因此当我运行程序时,即使路径在上次运行时被更改,它也知道XML文件的位置.
应用程序设置是否有可能忘记/处置文件路径值?或者其他任何相关的东西?
有没有更好的方法来实现我的目标?