C# 对应用程序参数使用SQL表而不是XML文件

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

我们的所有应用程序当前都使用Datamembers/Datacontacts和DataContactSerializer加载位于网络上的XML文件。我认为使用SQL表会更安全、更容易,即使我会失去类型安全性

我正试图找到一种在我的SQL表中重现类的方法,这样当我想要得到一个参数的值时,我只需要执行MyConfig.Property,但除了它,我找不到其他解决方案

  • 为每个属性/字段实现Get/Set
  • 列表项
  • B) 使用下面的代码,但每次我想要获取属性时,我都需要执行以下操作:MyConfig[nameof(property)]

    旧的VB.NET代码

    <!-- 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读取和写入设置。为什么不在启动时将整个表读取到内存中,并保持当前配置对象不变呢?顺便说一句,这不是配置问题……它是一个完全自己的状态对象,如果让更改在运行时发生,这可能更合适。