Использование таблицы SQL вместо файла XML для параметров приложения - PullRequest
0 голосов
/ 15 мая 2019

Все наши приложения в настоящее время загружают XML-файл, расположенный в сети, используя Datamembers / Datacontacts с DataContactSerializer. Я думаю, что было бы безопаснее и проще для нас использовать таблицу SQL, даже если бы я потерял безопасность типов.

Я пытаюсь найти способ воспроизвести мои классы внутри таблицы SQL, чтобы, когда я хочу получить значение параметра, мне нужно было только выполнить MyConfig.Property, но я не могу найти решение, отличное от

  1. Реализация Get / Set для каждого свойства / поля
  2. Элемент списка

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

Новый код C #

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();
        }

    }

}

Предварительный просмотр таблицы SQL

<table>
  <tr>
    <th>ID</th>
    <th>Name</th> 
    <th>Value</th>
  </tr>
  <tr>
    <td>1</td>
    <td>MyConfig.DefaultColor</td> 
    <td>Red</td>
  </tr>
  <tr>
    <td>2</td>
    <td>MyConfig.SiteA.Color</td> 
    <td>Blue</td>
  </tr>
</table>

1 Ответ

1 голос
/ 16 мая 2019

У меня есть сложный объект состояния, который я сериализую и десериализирую с DataContractSerializer, и мне это нравится.Не уверен, что вы действительно делаете себе какие-то одолжения.Вы будете наклоняться назад и делать много утомительных подробностей, которые делает сериализатор.То, что вы могли бы рассмотреть, это сериализацию контракта данных с потоком или строкой, которую вы читаете и записываете в базу данных.Я обнаружил, что для использования преимуществ обоих миров.

Мой объект состояния имеет переопределение 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( );
  }
}

... что делает его тривиальнымв nvarchar параметр в SQL, и это также помогает с диагностическим обследованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...