Как сохранить набор пользовательских объектов в user.config файл?

У вас может быть много причин, чтобы объяснить вашу проблему. Во-первых, вы уверены, что в настройках просмотра настроена электронная торговля? Если это так, это может быть причиной форматирования. Например, если идентификатор вашего заказа (в вашем примере 35308) отправляется как число, а не как строка, вы увидите попадание, но Google Analytics не будет обрабатывать вашу транзакцию, поскольку не будет понимать идентификатор заказа.

33
задан Dirk Vollmar 9 April 2009 в 15:07
поделиться

4 ответа

Я бы не стал хранить такие данные в app.config, по крайней мере, если бы они были обновлены программно. Концептуально, это для настроек конфигурации, а не для данных приложения, так что, возможно, вы хотите сохранить ваши имя пользователя и пароль в отдельном XML-файле (при условии, что вы не можете или не хотите использовать базу данных)?

Сказав это, тогда я думаю, что вам лучше всего читать в app.config как стандартный XML-файл, анализировать его, добавлять нужные вам узлы и записывать обратно. Встроенный в ConfigurationManager API не позволяет записывать новые настройки (что, как я полагаю, дает подсказку о предполагаемом использовании Microsoft).

7
ответ дан 27 November 2019 в 18:12
поделиться

Способ добавления пользовательской конфигурации (если вам требуется больше, чем просто простые типы) - это использовать ConfigurationSection, внутри которого для определенной вами схемы вам нужен набор ConfigurationElementCollection (установленный как коллекция по умолчанию без имени), который содержит элемент ConfigurationElement следующим образом:

public class UserElement : ConfigurationElement
{
    [ConfigurationProperty( "firstName", IsRequired = true )]
    public string FirstName
    {
        get { return (string) base[ "firstName" ]; }
        set { base[ "firstName" ] = value;}
    }

    [ConfigurationProperty( "lastName", IsRequired = true )]
    public string LastName
    {
        get { return (string) base[ "lastName" ]; }
        set { base[ "lastName" ] = value; }
    }

    [ConfigurationProperty( "email", IsRequired = true )]
    public string Email
    {
        get { return (string) base[ "email" ]; }
        set { base[ "email" ] = value; }
    }

    internal string Key
    {
        get { return string.Format( "{0}|{1}|{2}", FirstName, LastName, Email ); }
    }
}

[ConfigurationCollection( typeof(UserElement), AddItemName = "user", CollectionType = ConfigurationElementCollectionType.BasicMap )]
public class UserElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new UserElement();
    }

    protected override object GetElementKey( ConfigurationElement element )
    {
        return ( (UserElement) element ).Key;
    }

    public void Add( UserElement element )
    {
        BaseAdd( element );
    }

    public void Clear()
    {
        BaseClear();
    }

    public int IndexOf( UserElement element )
    {
        return BaseIndexOf( element );
    }

    public void Remove( UserElement element )
    {
        if( BaseIndexOf( element ) >= 0 )
        {
            BaseRemove( element.Key );
        }
    }

    public void RemoveAt( int index )
    {
        BaseRemoveAt( index );
    }

    public UserElement this[ int index ]
    {
        get { return (UserElement) BaseGet( index ); }
        set
        {
            if( BaseGet( index ) != null )
            {
                BaseRemoveAt( index );
            }
            BaseAdd( index, value );
        }
    }
}

public class UserInfoSection : ConfigurationSection
{
    private static readonly ConfigurationProperty _propUserInfo = new ConfigurationProperty(
            null,
            typeof(UserElementCollection),
            null,
            ConfigurationPropertyOptions.IsDefaultCollection
    );

    private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection();

    static UserInfoSection()
    {
        _properties.Add( _propUserInfo );
    }

    [ConfigurationProperty( "", Options = ConfigurationPropertyOptions.IsDefaultCollection )]
    public UserElementCollection Users
    {
        get { return (UserElementCollection) base[ _propUserInfo ]; }
    }
}

Я сохранил класс UserElement простым, хотя он действительно должен следовать шаблону объявления каждого свойства. полностью как описано в этой превосходной статье CodeProject . Как вы можете видеть, он представляет элементы «user» в предоставленной вами конфигурации.

Класс UserElementCollection просто поддерживает наличие более одного элемента «user», включая возможность добавлять / удалять / удалять элементы из коллекции, если вы хотите изменить его во время выполнения.

Наконец, существует UserInfoSection, который просто сообщает, что у него есть набор по умолчанию «пользовательских» элементов.

Далее приведен пример файла App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup>
      <section
        name="userInfo"
        type="ConsoleApplication1.UserInfoSection, ConsoleApplication1"
        allowDefinition="Everywhere"
        allowExeDefinition="MachineToLocalUser"
      />
    </sectionGroup>
  </configSections>

  <userInfo>
    <user firstName="John" lastName="Doe" email="John.Doe@company.com" />
    <user firstName="Jane" lastName="Doe" email="Jane.Doe@company.com" />
  </userInfo>
</configuration>

Как вы можете видеть, в этом примере я Я включил некоторые элементы userInfo / user в App.config. Я также добавил настройки, чтобы они могли быть определены на уровне машины / приложения / пользователя / роуминга-пользователя.

Далее нам нужно знать, как обновить их во время выполнения, следующий код показывает пример:

Configuration userConfig = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.PerUserRoamingAndLocal );

var userInfoSection = userConfig.GetSection( "userInfo" ) as UserInfoSection;

var userElement = new UserElement();

userElement.FirstName = "Sample";
userElement.LastName = "User";
userElement.Email = "Sample.User@company.com";

userInfoSection.Users.Add( userElement );

userConfig.Save();

Приведенный выше код создаст новый файл user.config, если это необходимо, он будет закопан глубоко в папке «Local Settings \ Application Data» для пользователя.

Если вместо этого вы хотите, чтобы новый пользователь был добавлен в файл app.config, просто измените его. параметр для метода OpenExeConfiguration () для ConfigurationUserLevel.None.

Как видите, это достаточно просто,

55
ответ дан 27 November 2019 в 18:12
поделиться

Use the new System.Configuration API from .Net Framework 2. (Assembly: System.Configuration) IConfigurationSectionHandler is obsolete.

You can find a lot of very good samples and descriptions at http://www.codeproject.com/KB/dotnet/mysteriesofconfiguration.aspx

There is also a code sample, about how you can modify and save values.


EDIT: Relevant part of the documentation in codeproject

Saves only modified values if any changes exist

Configuration.Save() 

Saves the specified level of changes, if any changes exist

Configuration.Save(ConfigurationSaveMode) 

Saves the specified level of changes, forcing a save to take place if the second parameter is true

Configuration.Save(ConfigurationSaveMode, bool)

The ConfigurationSaveMode enumeration has the following values:

  • Full - Saves all configuration properties, whether they have changed or not
  • Modified - Saves properties that have been modified, even if the current value is the same as the original
  • Minimal - Saves only properties that have been modified and have different values than the original
1
ответ дан 27 November 2019 в 18:12
поделиться

вы должны создать класс, подобный:

public class MySettings : ConfigurationSection 
{
    public MySettings Settings = (MySettings)WebConfigurationManager.GetSection("MySettings");

    [ConfigurationProperty("MyConfigSetting1")]
    public string DefaultConnectionStringName
    {
        get { return (string)base["MyConfigSetting1"]; }
        set { base["MyConfigSetting1"] = value; }
    }
}

, после этого в вашем файле web.config используйте:

<section name="MySettings" type="MyNamespace.MySettings"/>
<MySettings MyConfigSetting1="myValue">

Это путь) Если вы хотите использовать не атрибуты, а свойства, просто создайте класс, производный от ConfigurationElement, и включите его в свой класс, исключенный из ConfigurationSettings.

-1
ответ дан 27 November 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: