c# - 我将如何为应用程序创建复合设置?

标签 c# settings mef application-settings composite

我想做的是拥有一个可以在复合应用程序中使用的多功能设置类。当我添加功能和组件并使用 MEF 和 Prism 编写应用程序时,我希望有一个设置窗口可以自动将每个模块的设置界面加载到窗口中(使用 Prism 和 MEF)

处理设置的方式有很多种,最吸引我的是以下几种方式:

public class AppData : ApplicationSettingsBase
{
  [UserScopedSetting()]
  [DefaultSettingValue("true")]
  public bool Clipboard
  {
    get { return ((bool)this["Clipboard"]); }
    set { this["Clipboard"] = (bool)value; }
  }
}

它允许我设置一个默认值,我假设如果应用程序没有找到 .settings 文件,那么它将创建一个具有默认值的文件。但是,我需要为每个模块设置部分编写一堆自定义代码,并为每个模块创建一个唯一的对话框,或者尝试使用一个设置管理器来手动加载它们。

有些设置也有多个值,但上面的示例似乎无法容纳这些值。如果我有一个存储某物列表的设置怎么办?例如,如果我有一个设置是 ValidBlock,并且在开始时有两个可能有效的 block ,但将来可能需要添加更多?您能否拥有一个列表设置并为该设置指定多个默认值?

那么创建一个以某种方式使用 ApplicationSettingsBase 的 Isettings 接口(interface)是否可以接受,这样我就可以使用 MEF 找到目录中所有模块中的所有 Isettings 实现,然后为它找到的每个实现编写一个带有选项卡的对话框?在 Isettings 界面中,我可以拥有一些基本属性,例如名称以及在 MEF WPF 窗口中标记和描述模块所需的任何其他内容。

我唯一不喜欢的是到处都是字符串和属性。有没有办法流畅地处理设置?我正在考虑拥有一个 ISettings 实现,您将明确编写如下所示的设置:

public class AppData : ISettings
{ 
    Setting Clipboard = new Setting();
    Clipboard.Scope = SettingScope.User;
    Clipboard.SettingType = List<String>;

    List<String> DefaultClipboards = new List<String>();
    DefaultClipboards.Add("FoxClipboard");
    Clipboard.DefaultSetting = DefaultClipboards;
}

我知道上面的语法不完全正确,我不认为 Clipboard.SettingType 会站得住脚,但它可以让我了解我的想法。因此,如果在丢失设置文件的情况下保持创 build 置文件的同时可以实现这样的事情,那将是理想的。除了像这样的东西,MEF 还可以找到所有 ISettings 实现并为每个实现创建一个选项卡,然后根据代码中的设置添加每个设置。

这是正确的轨道吗?是否有我错过的框架或项目可以处理我的目标?我在想可能有比我概述的更好的方法吗?

我确信这个问题已经出现在复合应用程序开发中,但我还没有找到概述这种情况的框架或答案。

我已经能够创建一个松散耦合的复合应用程序并使用 MEF 和 Prism 动态连接我的模块,但我一直无法找到一种令人满意的方法来以复合方式处理设置。

最佳答案

我在工作中为我的一个应用程序解决了类似的问题。我们进一步倾向于您的第二个想法,其中只有一个我们用于 MEF 组合的基本设置界面“ISettings”。

我们创建了一个自定义导出提供程序来处理加载设置,并有一个管理器使用一些序列化程序保存设置。

对于 UI,我们有面向用户设置的模块,还导出一个“设置工作区”,我们将加载到设置 UI 中。使用反射,我们编写了一个方法来深度复制设置对象,以便我们可以直接将 mvvm 绑定(bind)到克隆的对象(用于取消功能),以及获取一个对象并将其属性复制回来。

反射是允许通用克隆/复制,而无需为每个设置对象编写代码。

此外,我们为数据模型绑定(bind)所做的一件至今我仍然喜欢的事情是“INotifyPropertyChanged”接口(interface)。我们的基础 ISettings 对象需要它。这不仅允许设置 UI 直接绑定(bind)到设置并监听更改,而且当我们点击应用或确定时,我们所有需要设置的数据模型都会为 prop changed 事件注册,因此当设置发生变化时它们都会自动收到通知改变了。

查看 Property Observer如果您打算执行通知路线。此应用程序已部署,我仍然觉得我们的设置框架非常成功。

如果您需要,我可以在某些方面提供更多详细信息。

希望这对您有所帮助!

关于c# - 我将如何为应用程序创建复合设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216264/

相关文章:

javascript - 无法删除文件,因为它正被另一个进程 ASP.NET Core MVC 使用

c# - 如何从 ASP.NET 发送大量电子邮件?

ios - 直接在设置应用中打开通知权限

ios - 设置中的 iCloud iCon 仅在 iOS 中显示为白色

c# - 结合 MEF 和 IoC 容器

reflection - MEF:加载具有不同属性的部件(插件)

c# - Caliburn micro 在使用 mef 时找不到 MainView

c# - 如果项目是由 SharpDevelop 生成的,则 OpenFileDialog 会被 Norton Antivirus 阻止

c# - 我想从 Windows MDI 子窗体中删除图标

java - 如何使用 ListPreferences 保存和应用用户设置?