ConfigurationSection nie tylko read-only

Dzisiaj odwołam się do wpisu Tworzenie własnej ConfigurationSection. W tamtym podejściu tylko czytałem z konfiguracji.

Po code review

Miałem tutaj więc problem co zrobić z testami. Wybrałem podejście tworzenia interfejsów dla każdej wartości którą chciałem ustawiać w testach. Przykładowo:

public interface ITrustedApplications
{
    IEnumerable<TrustedApplications> GetApplications();
} 

W testach mockowałem ten interfejs, a w kodzie produkcyjnym była klasa, która pobierała dane z właściwej konfiguracji. Takich interfejsów było więcej i to było złe. Na code review wyszło, że tak nie można.

Zapisywalna konfiguracja

Nie ma powodu, dla którego nie można mieścić również settera dla każdej właściwości.

public class MySection : ConfigurationSection
{
    public static MySection Current
    {
        get { return (MySection)ConfigurationManager.GetSection("mySection"); }
    }

    private const string TrustedApplicationsPropertyName = "trustedApplications"; 

    [ConfigurationProperty(TrustedApplicationsPropertyName)]
    [ConfigurationCollection(typeof (TrustedApplications), AddItemName = "application")]
    public TrustedApplications TrustedApplications
    {
        get { return this[TrustedApplicationsPropertyName] as TrustedApplications; }
        set { this[TrustedApplicationsPropertyName] = value; }
    }

    private const string CacheDurationName = "cacheDuration";

    [ConfigurationProperty(CacheDurationName, IsRequired = true)]
    public TimeSpan CacheDuration
    {
        get { return (TimeSpan)this[CacheDurationName]; }
        set { this[CacheDurationName] = value; }
    }
} 

W kodzie applikacji będziemy korzystać z interfejsu IMySectionConfiguration.


public interface IMySectionConfiguration
{
    IEnumerable<TrustedApplications> TrustedApplications { get; }
    TimeSpan CacheDuration { get; } 
    // and much more
}

MySection będzie implementować IMySectionConfiguration. W testach jednostkowych będziemy tworzyć całą konfigurację w kodzie.



var mySection = new Section();

mySection.CacheDuration = TimeSpan.Zero;

// and much more


ServiceLocator.Register<IMySectionConfiguration>(mySection);

A w produkcyjnej aplikacji wrzucamy konfigurację plikową.


ServiceLocator.Register<IMySectionConfiguration>(MySection.Current);

Inne rozwiązania

Jeśli nie jest dobre, że MySection implementuje IMySectionConfiguration, to można jeszcze tworzyć klasę, która wrapuje MySection.

Co zyskaliśmy

Jeden interfejs zamist wielu interfejsów, które miały po jednej metodzie i nawet ciężko je było dobrze nazwać.

Advertisements
Ten wpis został opublikowany w kategorii Lessons Learned i oznaczony tagami , , . Dodaj zakładkę do bezpośredniego odnośnika.

Jedna odpowiedź na „ConfigurationSection nie tylko read-only

  1. Pingback: dotnetomaniak.pl

Możliwość komentowania jest wyłączona.