Tre*_*bob 8 c# architecture asp.net
我正在尝试创建一些东西来在我们的ASP.NET网站中保存全局站点范围的设置 - 诸如站点名称,谷歌分析帐号,facebook URL等等...该站点可以有多个"品牌"或子站点关联使用它,因此是sitguid列,我们还希望可以选择将它们分组,因此组列 - 例如TEST和PRODUCTION(通过web.config appsetting设置).
我不希望任何KEY在任何地方被硬编码,但我希望能够在代码中尽可能简单地引用它们,例如SiteSetting.getSetting("SiteName")(这些可以用在模板中(masterpages等) )更多初级开发者将创建)
我还希望能够管理管理控制台中的现有设置,并能够创建新设置.
数据类型列用于编辑表单,以便可以使用正确的输入元素,例如位类型的复选框,varchar的文本框等...
SiteSettings数据库表目前:
[sts_sitGuid] [uniqueidentifier] NOT NULL, -- tells us which site the setting is for
[sts_group] [nvarchar](50) NOT NULL, -- used to group settings e.g. test/live
[sts_name] [nvarchar](max) NULL, -- the display name of the setting, for edit forms
[sts_alias] [nvarchar](50) NOT NULL, -- the name for the setting
[sts_value] [nvarchar](max) NOT NULL, -- the settings value
[sts_dataType] [nvarchar](50) NULL, -- indicates the control to render on edit form
[sts_ord] [tinyint] NULL, -- The order they will appear in on the admin form
Run Code Online (Sandbox Code Playgroud)
我现在已经完成了这项工作的一部分,但是我对我的工作方式并不满意,并且希望有人在这里提出任何有助于找到"正确"解决方案的建议!我相信人们已经在我面前这样做了.(我会分享到目前为止我所拥有的内容,但不想以任何特定的方式扭曲答案)我正在寻找的是概述如何做得最好,而不是寻找任何人为我写的; )
我在这里和谷歌都做了很多搜索,并没有真正找到我想要的东西,特别是能够添加新的设置'定义'以及编辑现有的设置.
该系统使用webforms在ASP.NET上运行,它全部用c#编写并使用MSSQL 2008.
一如既往,非常感谢任何帮助!
编辑:澄清我将解释到目前为止我已经建立了什么.因为我们不希望web.config或其他xml文件或其他数据库浮出水面,因为当我们将应用程序推广到其他客户时它会给我们更多的事情,因此我已经将所有这些存储在SQL中了.
到目前为止,我有一个SiteSettings类,它有一个GetSetting方法,我可以用GetSetting("SettingAlias")调用它来获取DB中"SettingAlias"的值.此类的构造函数从数据库中获取当前站点的所有设置,并将这些设置存储在字典中,GetSetting从该字典中读取.到目前为止,所有这一部分我都很满意.
我正在努力的部分是生成编辑表单.之前的版本使用了web服务来获取/设置设置,我试图继续使用类似的东西来保存工作,但它们都在代码中定义,例如GoogleAnalyticsID,Sitename等...并且每个都有一个列在数据库中,我所做的更改是将这些设置存储为ROWS(从那时起,它更容易添加更多,无需更改架构和所有sitesettings类)目前我的SiteSettings类有一个SiteSettingsEditForm方法,它抓住所有来自db的信息为表单元素创建了一堆控件,将它放在一个临时页面中并执行它,然后通过ajax将生成的HTML传递给我们的管理系统.这感觉不对,有点笨拙,并且是在这里发布它的原因,我无法弄清楚如何通过webservice保存这些东西,但更重要的是通过执行包含负载的页面生成一堆HTML表单控件只是感觉像是错误的方式.
总而言之,我(想想)我想编写一个类,以便能够从数据库表中缓存和读取少量行,并且还给我一个编辑表单(或者将数据提供给其他人以生成表单),即动态基于相同数据库表的内容(例如,我的类型列是'位'我想要一个复选框,它是'文本'我想要一个文本输入)
有时,如果从数据模型开始,此类问题更容易可视化。如果您想要每行一个设置,那么两个表可能是存储它的最佳方式:
地点:
站点 ID 站点密钥 站点名称 1 XYGZ4345 客户端站点 1 2 AZT43752 客户端站点 2
这将定义您配置的站点列表。我会使用 SiteKey,因为您将其放入 web.config 中,最好将其抽象为随机字符串或 GUID(以使其更难意外加载其他人的配置),客户端可以更改他们的名称和您将来不会感到困惑,因为您没有使用他们的旧名称作为密钥等。
如果我们将每个设置视为一个字符串,配置表本身也很简单:
站点设置:
设置 ID 站点 ID 设置名称 设置值 1 1 品牌 KrustyBrand 2 1 GoogleId MSFTSUX0R 3 2 品牌 ConfigMasters(TM)
然后您可以非常简单地加载所有配置:
SELECT * FROM SiteSetting INNER JOIN Site ON (SiteSetting.SiteId = Site.SiteId) WHERE Site.SiteKey = 'XYGZ4345'
Run Code Online (Sandbox Code Playgroud)
现在我们有了一个键值对列表,您可以将其存储在一个类中,例如:
public class SiteSetting
{
public Site Site {
get; set; //Site would just be a simple class consisiting of Id, Key and Name to match the database table
}
protected Dictionary<String, String> Settings { get; set; } //Simple key value pairs
}
Run Code Online (Sandbox Code Playgroud)
所以这是一个非常简单的解决方案。然而,我们可以更进一步——需要考虑的事情:
1)我们可以在某个地方添加一个环境吗?
我们可以为每个环境添加一个站点
或者
将环境添加到 SiteSetting 表。这样做的优点是您可以定义 enironment = 'ALL' 以避免重复。
或者
加载配置的数据库定义了环境;因此您可以更改应用程序配置中的配置连接字符串。当然,要连接到不同的环境,您必须更改 app.config,但无论如何您可能都必须这样做才能更改客户端密钥和/或环境。
2) 添加用户可定义设置的概念 - 有些设置您想要更改,有些设置您想要锁定。包含“UserDefinable”的位列将允许您对此进行排序
3) 输入设置。
这个稍微困难一些。你可能有类似的东西:
PropertyId PropertyName PropertyType 格式用户定义 1 品牌字符串 NULL 1 2 日期演示日期时间“yyyy-MM-dd”1
然后,Settings 表仅定义一个值和一个 PropertyId。这样做的优点是,您可以开始增加有关所存储的每个设置的信息,并在设计更加规范化时重复使用这些信息。然后 Settings 类会发生如下变化:
public List<PropertyValue> { get; set; } //replacing the dictionary
Run Code Online (Sandbox Code Playgroud)
PropertyValue 看起来像这样:
public class PropertyValue
{
int Id { get; set; }
public string Name { get; set; }
public string Value { get; set; }
public string PVType { get; set; } //Could be an enum
public string DisplayFormat { get; set;
private string _RawValue;
public string Value{
get{
switch(PVType){
case "DateTime":
return Convert.ToDateTime(_RawValue).ToString(DisplayFormat);
break;
case "Double":
return Convert.ToDouble(_RawValue).ToString(DisplayFormat);
break;
default:
return _RawValue;
}
}
set{
_RawValue = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
像 Value 方法这样的东西需要改进以支持强大的错误处理(您还可以使用 Convert.ChangeType 来简化 switch 块)
这个主题可以简单也可以复杂,取决于您的选择;-)
编辑
关于维护它们;一个非常简单的 GUI 将允许用户以表格格式查看其所有属性。您可能会考虑将 UserDefinable = 0 的行设置为只读,否则用户可以编辑和添加行。您需要进行验证,尤其是对于重复的设置名称。
最简单的方法是使用 DataGrid;一个简单的模型可能看起来像这样:
更复杂的方法可能看起来像这样
因此,生成表单就像将 PropertyValue 对象的集合数据绑定到您选择的网格解决方案一样简单。