【问题标题】:Best way to store settings (special requirements)存储设置的最佳方式(特殊要求)
【发布时间】:2014-02-26 14:55:07
【问题描述】:

我发现了很多关于在不同位置保存不同类型的应用程序/用户设置的信息,但我对什么可能是最适合我的方式感到困惑。

我的问题有不同的维度:

  1. 应用程序将有一些用户角色(管理员、标准用户、...),其中每个用户(基于 Windows 登录)将属于一个角色。 管理员可以为所有人设置一切。
  2. 设置有不同的类别:
    • 应用程序设置(对于计算机上的每个用户都应该相同)
    • 用户角色特定设置
    • 用户特定设置
  3. 该应用程序有多个项目,不同的项目必须访问这些设置。

(4. 应用程序是用 C# 编写的)

我不想提及我读过的东西,因为我不想把你的想法引向一个(可能是错误的)方向。 那么,您将如何处理这种情况?

非常感谢!! 约尔格


编辑 1

在第一个答案之后,我希望可以澄清我的问题:

  • 我的问题不关注用户身份验证,而是关注创建/编辑/保存设置
  • 我第一次尝试解决这个问题是:
    1. 使用 Visual Studio Settings.Settings 文件
      ...不起作用,因为我有几个项目必须有权访问设置,并且我找不到使 ApplicationSettings 可写的方法(它们是只读的)
    2. 使用ConfigurationManager-Class
      ...我对此没有经验,但据我了解,这只是另一个让我可以访问我的 ApplicationSettings 的课程(并且有与 #1 相同的问题)
      ...也许教程的链接会有所帮助
    3. 自己发明一些东西
      ...我还是希望能找到现成的东西

【问题讨论】:

  • 仅供参考,您可以通过将范围从“应用程序”更改为“用户”来使设置可写。
  • 我知道,但我希望管理员可以更改计算机上每个用户的选项。如果我使用“用户”范围,它将保存在用户文件夹中
  • 我已经用一种技术更新了我的答案,你可以用它来完成管理员覆盖。

标签: c# architecture application-settings


【解决方案1】:

我猜在这种情况下你可能有一个数据库。当您在其中合并用户、用户权限等时,它可能也是保存应用程序设置的好地方。

我一直喜欢以数据库为中心的解决方案,因为有很多可用的解决方案(当您想基于同一系统创建新的 UI 时,您可以重用那里的设置)。

我认为实体-属性-价值模型是一个值得考虑的好设计策略。

您可以创建一个带有触发器的视图,其中隐藏系统属性,使管理员可以更改所有属性,而用户只能更改他们的属性。

【讨论】:

  • 我的应用程序还没有数据库。我想避免这种情况,因为我觉得它对于这个问题来说太大了......
  • 好的,那么请缩小您的问题范围,让您目前的情况更清楚。
  • 如果事实证明数据库将是最好的解决方案,我将设置一个。所以我一般不会消除这个想法。因为我还处于设计阶段,所以我想问一个“开放”的问题。
  • @joerg:但是开放式问题从不提供具体的答案,您期望通过说“我不能这样做,因为......”来回答。只是想帮助你。
【解决方案2】:

根据你的描述,我会说你想要Role Based Authentication。这是asked before 的东西。我会去link specified in that answer 查找有关如何解决此问题的概述和一些代码示例。

Microsoft 在添加成员资格提供程序和现在的 ASP.NET 身份框架(如果您有 Web 应用程序)的一些抽象方面做得很好。无论您选择做什么,都将涉及数据库或配置文件(查看here 以了解如何管理这些文件)以及某种claim derived system

【讨论】:

    【解决方案3】:

    假设:您已经弄清楚您将如何处理角色,您的问题只是关于设置的存储/检索。

    第 3 点意味着您不能将 Settings 文件用于应用程序和用户范围的设置,并结合使用 custom configuration section 来保存角色特定设置(可选 encrypted)。

    我的下一个建议是公开设置的 WCF 端点,可以是完整的(应用程序的安全修剪内容 + 特定于用户 + 特定于角色),也可以通过某种等效的字典查找。另外:

    • 端点需要要求 Windows 身份验证(或可能的声明),以便它可以确定用户特定/角色特定部分。
    • 然后,每个应用程序都需要了解 WCF 端点,无论是通过配置还是可能通过 WCF Discovery

    更新: 请注意,WCF 不能解决您的存储问题,但它有助于您的第 3 点 - 需要使用相同设置的多个项目。 WCF 端点允许单个项目封装设置的存储/检索以供多个客户端重复使用。 WCF 阅读起来可能很复杂,但实际上它很容易设置 - 您只需装饰一个界面并将其托管在 IIS 中。如果您不喜欢使用 IIS,您也可以自己将其托管在诸如 Windows 服务之类的东西中,但是将其部署到 IIS 会容易得多。然后,您可以通过将服务引用添加到您的项目来在您的其他应用程序中使用它,然后您调用接口代码,就像代码在您自己的项目中一样。

    如果您谈论的是具有多个类库的单个应用程序:

    我在上面描述的假设您正在制作多个都需要共享设置的应用程序。如果您实际上是在谈论具有多个类库项目的单个应用程序,则仍然可以使用内置设置 - 您只需执行一个手动步骤即可使其跨项目工作。将设置添加到应用程序项目和类库项目后,您应该复制包含类库中设置的 app.config 部分,并将其复制/粘贴到应用程序的 app.config 中。 Visual Studio 不是很聪明,它只会将类库设置更改同步到类库项目中的 app.config,即使类库的 app.config 不是“真实的东西”,因为只有使用类库的应用程序的 app.config 实际上是默认使用的(这就是您需要将其合并到应用程序的 app.config 中的原因)。

    如果您需要多个类库(包括主应用程序项目)使用相同的设置,您可以制作一个专门的类库项目来保存设置(注意您可以将多个设置文件添加到该项目中进行设置更模块化),然后所有其他项目都可以引用公共设置项目(为避免循环依赖,您不会在主应用程序项目中保存类库所需的任何设置)。

    覆盖用户的设置

    Settings 对象有一种机制可以用来覆盖设置(例如,由管理员指定的值)。当您将 Settings 对象添加到您的项目时,它会创建一个带有一些示例代码的 Settings 分部类,用于连接到 SettingsLoaded 事件。在这种情况下,您可以加载您的管理设置(通过 WCF 调用,或者可能从文件系统上的已知位置)并应用任何覆盖。

    【讨论】:

    • 假设:你已经弄清楚了你将如何处理角色,而你的问题只是关于设置的存储/检索 是的,你明白了!将看看 WCF(以前没有使用过)。
    • 我认为 WCF 本身并不是一个解决方案,您总是需要一个额外的解决方案来保存设置。 WCF 只是一种通信协议。
    • 在简短阅读了 WCF 之后,我觉得这对我来说有点过分了。不能用静态类解决第 3 点吗? (我知道这不能回答保存设置的问题)
    • 关于静态类 - 这让我觉得当你说多个项目时我可能做出了错误的假设。我假设您的意思是多个应用程序 - 您实际上是在谈论具有多个类库项目的单个应用程序吗?
    • 仅供参考,我也忘了提到我更新了我的答案以回应有关 WCF 的 cmets。
    猜你喜欢
    • 2016-12-23
    • 2013-03-28
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多