2012-03-21 15 views
5

Używam następujące ramy konfiguracyjnych rodzimych zarządzanie konfiguracją moich projektów przez kilka lat:Wymiana ramy konfiguracyjne, szukając alternatywnego

  1. Pierwsze jeden laduje Java .properties plików (kilka linii supergroup.subgroup.property=value z obsługą kolekcji) i działa dobrze w wielu sytuacjach (uważam, że jest to najlepsze dla małych aplikacji). Ten dobrze dla bardzo prostych konfiguracji

  2. DRUGIM podstawie DataContractSerializer (i ewentualnie XmlSerializer), w którym wszystkie funkcjonalności pierwszego ze wszystkimi z zalet XML i mniejszej hydraulicznego, aby działać. Ta jest dobra, ale niepraktyczna i uciążliwa w zarządzaniu bez jawnego interfejsu użytkownika, aby złagodzić bóle głowy nauczania użytkowników końcowych w celu modyfikacji XML.

Oba istniejących ram marszałka do iz Poços bez problemu, aby umożliwić dostęp do wartości konfiguracyjnych poprzez Properties/polami (poprzez ręczny/automatyczny serializacji odpowiednio), a więc są bardzo łatwe do pracy jako deweloper.

Teraz, gdy sprawdzam ich zdolność do włączenia bazy danych i płynnej konfiguracji, szukam alternatywnej (najlepiej open source) alternatywy. Nie mam problemu z przerabianiem wszystkich moich istniejących projektów, jeśli mogę ograniczyć niepotrzebne duplikowanie kodu i zezwolić im na dostęp do bazy danych i płynną konfigurację (oprócz ich istniejących umiejętności).

Jakieś sugestie, czy też warto je przetasować, aby uzyskać funkcje, których szukam?

W moich badań znalazłem this potencjalnie duplikat pytanie, które jest odbierane przez Nini ale nie został zaktualizowany w prawie 2 lat i obsługuje tylko opcje mam już objęte (na podstawie jego dokumentacji w każdym razie). Czy tęskniłem za czymś w swoich badaniach lub czy istnieje lepsza alternatywa?

Aktualizacja

Na wyraźne cechy Jestem po to:

  • pliki XML
  • INI/Java-jak properties pliki
  • Database (przynajmniej MS SQL i SQLite, opcjonalnie MySQL i wszelkie inne, jak można sobie wyobrazić)
  • Płynna (generowanie kodu nie jest wymagane)
  • Jakieś rozszerzenie API, które pozwala mi dodawać własne źródła.
  • Z pewnością konieczne jest przekształcenie do/z dowolnego źródła danych, aby było dostępne za pośrednictwem właściwości/pól.
  • wsparcie Wyliczanie

byłbym zainteresowany w rozszerzaniu istniejących ram, jeśli jest wystarczająco otwarty na to, co muszę zrobić, ale poza tym to chyba nie jest dobrym rozwiązaniem.


UPDATE

Funkcjonalność z istniejącego System.Configuration nazw jest wielki, a ja jestem pewny, jak dobrze może to działać, ale w ogóle nie robić to, co szukam. Używałem go (nawet w zaawansowanych scenariuszach), ale ponieważ umożliwia on jedynie ograniczoną rozszerzalność kodu XML: po prostu nie jest to tym, za czym jestem.

Jeśli muszę podać jedną z predefiniowanych funkcji, powiedziałbym, że płynna konfiguracja jest najmniej ważna (bardzo trudno byłoby zapewnić cenny interfejs dla tego ogólnie). Po prostu połączę coś ze wszystkim, co znajdę.

Sam fakt, że minęło ponad 24 godziny (i> 125 wyświetleń) i nikt nie był w stanie zaoferować rozsądnej alternatywy, mówi mi, że prawdopodobnie nie istnieje. Zacznę od siebie w nadziei, że ktoś może zapewnić interesującą alternatywę.

+0

Czy potrafisz sprecyzować funkcje, których szukasz? Dostęp do DB (co oznacza, że ​​przechowuję konfigurację w centralnym repozytorium, jak sądzę) i płynną konfigurację. Coś jeszcze? –

+0

@VincentHubert - Zaktualizowano z minimalnymi wymaganiami. –

+1

w zakresie przeróbek projektu, należy pamiętać o Interface Not Implementation - IMHO, to jest rzecz, w której tworzy się interfejs, który określa, w jaki sposób chcemy, aby kod mógł wchodzić w interakcję z bieżącą strukturą konfiguracji. Następnie, jeśli coś nie spełnia wszystkich twoich potrzeb, możesz po prostu "wypełnić luki", aby interfejs został zaimplementowany –

Odpowiedz

2

Tworzenie ogólnego menedżera konfiguracji jest bardzo wymagającym zadaniem. Z biegiem lat, nie widziałem żadnych ram konfiguracyjnych powstających i nie rzeczy, które będę. Wystarczy spojrzeć na obszar nazw System.Configuration, aby przekonać się, jak drogo byłoby spróbować dopasować podobny zestaw funkcji. Przez większość czasu wymagania konfiguracyjne są bardzo specyficzne dla projektu i nie ma srebrnej kuli.

Moja rada to trzymanie się własnego rozwiązania, o ile można go łatwo przetestować i wykonać.

+0

Zgadzam się, że stworzenie go byłoby bardzo czasochłonne, łącznie z godzinami bicia mojej głowy na moim biurku. Zgadzam się również, że rozwiązanie _one size pasuje all-out-of-the-box to nierozsądne żądanie i niestandardowy kod będzie prawdopodobnie nadal musiał zostać napisany/wygenerowany. Dlatego zapytałem o konfigurację _framework_ zamiast konfiguracji _manager_. Idealnie byłoby bardziej jak WCF; seria zabawek do majsterkowania, które można skleić na różne sposoby, aby osiągnąć wspólny cel, wystarczy samemu zrobić klej. –

+2

Nie spotkałem się również z taką strukturą (chociaż przez lata zbudowałem całkiem kolekcję lub odpowiednie klasy). Nawiasem mówiąc, nawet słowo "like WCF" jest przerażające (biorąc pod uwagę rozmiar WCF!). –

+0

Ja też niestety nie. +1 za udzielenie racjonalnej (czytaj: rozsądnej) odpowiedzi, ale zamierzam nadal szukać rozwiązania. –

2

Proszę to sprawdzić Cinchoo Configuration Framework, oferuje większość funkcji, których szukasz.

Oto prosty sposób zdefiniować i użyć obiektu konfiguracji za pomocą Cinchoo ramowa

namespace HelloWorld 
{ 
    #region NameSpaces 

    using System; 
    using Cinchoo.Core.Configuration; 

    #endregion NameSpaces 

    [ChoConfigurationSection("sample")] 
    public class SampleConfigSection : ChoConfigurableObject 
    { 
     [ChoPropertyInfo("name", DefaultValue="Mark")] 
     public string Name; 

     [ChoPropertyInfo("message", DefaultValue="Hello World!")] 
     public string Message; 
    } 

    static void Main(string[] args) 
    { 
     SampleConfigSection sampleConfigSection = new SampleConfigSection(); 
     Console.WriteLine(sampleConfigSection.ToString()); 
    } 

} 

raz pierwszy, po uruchomieniu aplikacji, Cinchoo ramy automatycznie generuje sekcji konfiguracji jak poniżej. Następnie możesz kontrolować je za pomocą źródła konfiguracji lub kodu.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="sample" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7dacd80ff3e33de" /> 
    </configSections> 
    <sample> 
    <add key="name" value="Mark" /> 
    <add key="message" value="Hello World!" /> 
    </sample> 
</configuration> 
0

Rozwiązanie mam dla was przychodzi w Spring Framework .NET, który wśród innych mistrzów cechy mają PropertyPlaceholderConfigurer klasę.

Ta klasa ma na celu uzewnętrznić niektóre właściwości posiadanych plików konfiguracyjnych xml. Zamiast tego zapisz wartości literowe (takie jak ciągi połączeń, hasła lub inne parametry), w których wstawisz symbole zastępcze, takie jak $ {sql.server}, $ {sql.password}, ​​które zostaną automatycznie zastąpione wartościami zewnętrznymi.

Te wartości zewnętrzne mogą być w dowolnym miejscu. W przypadku mojej firmy, ponieważ mamy starszą wersję systemu, która używa tych samych wartości, umieściliśmy je w rejestrze systemu Windows (co oczywiście nie jest zalecane w przypadku nowych projektów).

Należy jednak pamiętać, że nie jest to samodzielna funkcja Spring, która jest dostępna w Spring.Core, a będziesz musiał użyć plików konfiguracyjnych sprężyny i funkcji Dependency Injection.

http://www.springframework.net/doc-latest/reference/html/objects.html#objects-factory-placeholderconfigurer

+1

Wygląda na to, że działa tylko z XMLem, co jest dalekie od tego, czego szukam, a perspektywa integracji __________ z innymi ramami w nim brzmi jak cała masa pracy. Z pewnością przyjrzę się temu dokładniej, ponieważ powiedziałeś, że twoja firma używa go do konfiguracji rejestru. Czy wiesz, ile wysiłku włożyłeś w to, aby to zadziałało? Mimo że wymaga więcej niż to, czego oczekuję, może stanowić przyzwoity model dla moich wysiłków. –

+0

Cóż, główny wysiłek polega na tym, aby Spring pracował w twoim projekcie. Jeśli nie masz wcześniejszych doświadczeń ze Spring, może to być trochę trudne, a nawet bolesne. Ale moim zdaniem warto. Stworzyłem bardzo prosty przykład i umieść kod Google, jeśli chcesz zobaczyć przykład (http://code.google.com/p/spring-net-placeholder-example/). Mam nadzieję, że to pomoże. – Beccari