C# 对应用程序参数使用SQL表而不是XML文件
我们的所有应用程序当前都使用Datamembers/Datacontacts和DataContactSerializer加载位于网络上的XML文件。我认为使用SQL表会更安全、更容易,即使我会失去类型安全性 我正试图找到一种在我的SQL表中重现类的方法,这样当我想要得到一个参数的值时,我只需要执行MyConfig.Property,但除了它,我找不到其他解决方案C# 对应用程序参数使用SQL表而不是XML文件,c#,sql,vb.net,visual-studio,C#,Sql,Vb.net,Visual Studio,我们的所有应用程序当前都使用Datamembers/Datacontacts和DataContactSerializer加载位于网络上的XML文件。我认为使用SQL表会更安全、更容易,即使我会失去类型安全性 我正试图找到一种在我的SQL表中重现类的方法,这样当我想要得到一个参数的值时,我只需要执行MyConfig.Property,但除了它,我找不到其他解决方案 为每个属性/字段实现Get/Set 列表项 B) 使用下面的代码,但每次我想要获取属性时,我都需要执行以下操作:MyConfig[na
<!-- language: vb -->
Public Sub CreateConfig()
ConfigApplications = New ConfigurationApplications
ConfigRBTK = New ConfigurationRBTK2
ConfigRBRE = New ConfigurationRBRE2
ConfigTC = New ConfigurationTC2
ConfigTLS = New ConfigurationTLS2
ConfigTQ = New ConfigurationTQ2
ConfigSoustrait = New ConfigurationSoutrait
Dim ser As New DataContractSerializer(GetType(AppConfig4))
Dim Settings As New XmlWriterSettings
Settings.Indent = True
Dim W As XmlWriter = XmlWriter.Create(ConfigFile, Settings)
ser.WriteObject(W, Me)
W.Close()
End Sub
SQL表预览
public object this[string propertyName]
{
get
{
string fullName = typeof(MyConfig).GetField(propertyName).DeclaringType.FullName + "." + propertyName;
using (Info_IndusContext conn = new Info_IndusContext())
{
return conn.AppConfig.Where(x => x.Param == fullName).FirstOrDefault().Value;
}
}
set
{
string fullName = typeof(MyConfig).GetField(propertyName).DeclaringType.FullName + "." + propertyName;
using (Info_IndusContext conn = new Info_IndusContext())
{
conn.AppConfig.Where(x => x.Param == fullName).FirstOrDefault().Value = value.ToString();
conn.SaveChanges();
}
}
}
身份证件
名称
价值
1.
MyConfig.DefaultColor
红色
2.
MyConfig.SiteA.Color
蓝色
我有一个复杂的状态对象,我用DataContractSerializer
对它进行序列化和反序列化,我喜欢它。不确定你真的在帮自己什么忙。您将全力以赴,做很多序列化程序所做的乏味的详细工作。您可能要考虑的是将数据契约序列化为读写到DB的流或字符串。我发现这两个世界都有好处
我的状态对象有一个ToString()
覆盖,看起来有点像:
public override string ToString( )
{
var serializer = new DataContractSerializer( this.GetType( ) );
using ( var stream = new MemoryStream( ) )
{
var settings = new XmlWriterSettings( );
settings.Indent = true;
var writer = XmlWriter.Create( stream, settings );
{
serializer.WriteObject( writer, this );
writer.Flush( );
}
stream.Position = 0;
var reader = new StreamReader( stream );
return reader.ReadToEnd( );
}
}
…这使得在SQL中输入一个
nvarchar
参数变得很简单,而且它还有助于诊断检查。您可以使用一些共享代码将get&set减少到每行1行。在那之后,你实际上需要维护多少财产?我正在使用的系统大约有100个,没有任何投诉。我想我总共有大约1000个参数。我只是在想,在Get和Set中都有1000个具有相同代码的属性是浪费时间的。因此,我正在寻找一种方法,要么像“基本属性”一样,要么至少共享代码。您可以始终使用VS对属性所做的操作,并在模型更改时使用T4模板自动生成代码。此外,1000个应用程序配置项?!?!?!?对我来说,这是一种代码的味道。两种代码并不等同。旧版本一次读取整个内容,然后您只需从内存对象读取/写入设置,而新版本在每次访问设置时从DB读取和写入设置。为什么不在启动时将整个表读取到内存中,并保持当前配置对象不变呢?顺便说一句,这不是配置问题……它是一个完全自己的状态对象,如果让更改在运行时发生,这可能更合适。