it-swarm.dev

app.config dla biblioteki klas

Nie widzę pliku app.config wygenerowanego dla biblioteki klas przez kreator VS2008. W moich badaniach odkryłem, że w aplikacji istnieje tylko jedna aplikacja app.config. 

Czy złym rozwiązaniem jest ręczne dodanie app.config do biblioteki klas lub czy istnieją inne metody, które będą służyć celowi app.config w bibliotece klas?

Muszę przechowywać informacje konfiguracyjne log4net wewnątrz pliku app.config.

59
logeeks

Zazwyczaj powinieneś nie dodać plik app.config do projektu biblioteki klas; nie będzie używany bez bolesnego zginania i skręcania z twojej strony. Projekt biblioteki wcale nie boli po prostu nic nie da.

Zamiast tego konfigurujesz aplikację, która używa twojej biblioteki; więc wymagane informacje o konfiguracji tam trafią. Każda aplikacja, która może korzystać z twojej biblioteki, prawdopodobnie będzie miała inne wymagania, więc to też ma sens logiczny.

79
Andrew Barber

Nie wiem, dlaczego ta odpowiedź nie została jeszcze podana:

Różni rozmówcy z tej samej biblioteki będą na ogół używać różnych konfiguracji. Oznacza to, że konfiguracja musi znajdować się w pliku wykonywalnym aplikacji, a nie w bibliotece klas.

Możesz utworzyć app.config w ramach projektu biblioteki klas. Będzie zawierać domyślne konfiguracje elementów tworzonych w bibliotece. Na przykład będzie zawierał ciągi połączeń, jeśli utworzysz model Entity Framework w bibliotece klas.

Ustawienia te nie będą jednak używane przez aplikację wykonywalną wywołującą bibliotekę. Zamiast tego ustawienia te można skopiować z pliku library.dll.config do aplikacji app.config lub web.config, aby można je było zmienić tak, aby były specyficzne dla wywołującego, oraz do środowiska, w którym wywołujący jest wdrożony.

Tak było z .NET od pierwszego dnia.

42
John Saunders

Jon, wydano wiele opinii, które nie odpowiadają poprawnie na twoje pytanie.

Dam MOJĄ OPINIĘ, a następnie powiem ci, jak zrobić dokładnie to, o co prosiłeś.

Nie widzę powodu, dla którego Zgromadzenie nie mogłoby mieć własnego pliku konfiguracyjnego. Dlaczego pierwszy poziom atomicy (czy to prawdziwe słowo?) Powinien znajdować się na poziomie aplikacji? Dlaczego nie na poziomie rozwiązania? To arbitralna, najlepiej odgadnięta decyzja i jako taka OPINIA. Jeśli miałbyś napisać bibliotekę logowania i chciałbyś dołączyć do niej plik konfiguracyjny, który byłby używany globalnie, dlaczego nie mógłbyś podłączyć się do wbudowanej funkcjonalności ustawień? Wszyscy to zrobiliśmy ... staraliśmy się zapewnić „potężną” funkcjonalność innym programistom. W jaki sposób? Przyjmując założenia, które z natury rzeczy przekładają się na ograniczenia. Dokładnie to samo zrobił MS ze strukturą ustawień, więc trzeba trochę „oszukać”.

Aby bezpośrednio odpowiedzieć na pytanie, po prostu dodaj plik konfiguracyjny ręcznie (xml) i nadaj mu nazwę, aby pasowała do biblioteki i dołączyć rozszerzenie „config”. Przykład:

MyDomain.Mylibrary.dll.Config

Następnie użyj menedżera konfiguracji ConfigurationManager, aby załadować plik i uzyskać dostęp do ustawień:

string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;

Zauważ, że to w pełni obsługuje heierarchię machine.config, nawet jeśli wyraźnie wybrałeś plik konfiguracyjny aplikacji. Innymi słowy, jeśli nie ma tego ustawienia, będzie ono większe. Ustawienia zastąpią również wpisy pliku machine.config.

34
Todd Beaulieu

Jeśli chcesz skonfigurować rejestrowanie projektu przy użyciu log4Net, podczas korzystania z biblioteki klas, nie ma rzeczywistego zapotrzebowania na żaden plik konfiguracyjny. Możesz skonfigurować logger log4net w klasie i używać tej klasy jako biblioteki.

Jako log4net zapewnia wszystkie opcje konfiguracji.

Znajdź poniższy kod.

public static void SetLogger(string pathName, string pattern)
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = pattern;
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = pathName;
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = log4net.Core.Level.Info;
            hierarchy.Configured = true;
      }

Teraz zamiast wywoływać XmlConfigurator.Configure (nowy FileInfo ("app.config")) można bezpośrednio wywołać SetLogger z żądaną ścieżką i wzorcem, aby ustawić rejestrator w funkcji uruchamiania aplikacji Global.asax. 

Użyj poniższego kodu, aby zarejestrować błąd.

        public static void getLog(string className, string message)
        {
            log4net.ILog iLOG = LogManager.GetLogger(className);
            iLOG.Error(message);    // Info, Fatal, Warn, Debug
        }

Używając następującego kodu, nie musisz pisać pojedynczej linii ani w aplikacji web.config, ani w aplikacji app.config biblioteki.

6
Rahul

W rzeczywistości biblioteka klas, którą implementujesz, pobiera informacje z app.config wewnątrz aplikacji, która je konsumuje, więc najbardziej właściwym sposobem implementacji konfiguracji dla bibliotek klas w .net w VS jest przygotuj app.config w aplikacji, aby skonfigurować wszystko, co zużywa, jak konfiguracja bibliotek.

Pracowałem trochę z log4net i odkryłem, że ten, kto przygotował aplikację, zawsze miał sekcję do konfiguracji log4net wewnątrz main app.config.

Mam nadzieję, że te informacje były przydatne.

Do zobaczenia i komentuj znalezione rozwiązanie.

EDYTOWAĆ:

Przy następnym łączu masz app.config z sekcją log4net:

http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx

4
Amedio

Właściwie, dla rzadkiego przypadku można zapisać app.config w bibliotekach klas (dodając ręcznie) i przeanalizować go przez OpenExeConfiguration .

 var fileMap =
    new ExeConfigurationFileMap {ExeConfigFilename = 
    @"C:\..somePath..\someName.config"};
 System.Configuration.Configuration config =
    ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
    ConfigurationUserLevel.None);

Powinieneś naprawdę oszacować rzeczywistą potrzebę tego. Dla danych abstrakcyjnych nie jest to najlepsze rozwiązanie, ale „sekcje konfiguracyjne” mogą być bardzo przydatne !!

Na przykład, zorganizowaliśmy naszą N-warstwową architekturę WCF oddzieloną, bez żadnych metadanych, po prostu za pomocą Unity Container i Injection Factory opartej na Channel Factory T. Dodaliśmy externall ClassLibrary dll z tylko [Service Contract] Interfejsami i wspólnym app.config w celu czytać punkty końcowe z sekcji klienta i łatwo dodawać/zmieniać je w jednym miejscu. 

4
Roma Borodov

Chcesz dodać App.config do twoich testów biblioteki klas, jeśli używasz śledzenia/loggera. W przeciwnym razie nic nie jest rejestrowane po uruchomieniu testu przez testera, takiego jak TestDriven.Net.

Na przykład używam TraceSource w moich programach, ale uruchamianie testów nie loguje niczego, chyba że dodam App.config plik z konfiguracją śledzenia/dziennika także do biblioteki klasy testowej.

W przeciwnym razie dodanie App.config do biblioteki klas nie robi nic.

3

Nie ma automatycznego dodawania pliku app.config podczas dodawania projektu biblioteki klas do rozwiązania.

O ile mi wiadomo, nie ma przeciwwskazań dotyczących robienia tego ręcznie. Myślę, że to powszechne użycie.

O konfiguracji log4Net nie musisz umieszczać konfiguracji w app.config, możesz mieć dedykowany plik conf w swoim projekcie, a także plik app.config w tym samym czasie.

ten link http://logging.Apache.org/log4net/release/manual/configuration.html poda przykłady na oba sposoby (sekcja w app.config i samodzielnym pliku conf4net4)

1
Bruno

Twoją odpowiedzią na nie ręczne tworzenie aplikacji.config jest karta Visual Studio Project Properties/Settings.

Gdy dodasz ustawienie i zapiszesz, twoja aplikacja app.config zostanie utworzona automatycznie .. W tym momencie generowany jest kod w przestrzeni nazw {yourclasslibrary. Properties} zawierającej właściwości odpowiadające twoim ustawieniom. Same ustawienia zostaną umieszczone w ustawieniach applicationSettings aplikacji app.config.

 <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<applicationSettings>
    <ClassLibrary.Properties.Settings>
        <setting name="Setting1" serializeAs="String">
            <value>3</value>
        </setting>
    </BookOneGenerator.Properties.Settings>
</applicationSettings>

Jeśli dodano ustawienie o zasięgu aplikacji o nazwie Setting1 = 3, zostanie utworzona właściwość o nazwie Setting1. Te właściwości stają się częścią kompilacji pliku binarnego i są ozdobione DefaultSettingValueAttribute, który jest ustawiony na wartość określoną w czasie programowania.

     [ApplicationScopedSetting]
    [DebuggerNonUserCode]
    [DefaultSettingValue("3")]
    public string Setting1
    {
        get
        {
            return (string)this["Setting1"];
        }
    }

Tak więc, jak w kodzie biblioteki klasowej, korzystasz z tych właściwości, jeśli odpowiednie ustawienie nie istnieje w pliku konfiguracyjnym środowiska wykonawczego, spowoduje to powrót do wartości domyślnej. W ten sposób aplikacja nie ulegnie awarii z powodu braku wpisu ustawień, co jest bardzo mylące za pierwszym razem, gdy nie wiesz, jak działają te rzeczy .. Teraz zadajesz sobie pytanie, jak określić naszą nową wartość w wdrożona biblioteka i unikać domyślnej wartości ustawienia? 

Stanie się tak, gdy poprawnie skonfigurujemy app.config pliku wykonywalnego. Dwa kroki. 1. zdajemy sobie sprawę, że będziemy mieli sekcję ustawień dla tej biblioteki klas i 2. z małymi modyfikacjami wklejamy plik konfiguracyjny biblioteki klas w wykonywalnej konfiguracji. (istnieje metoda, w której możesz zachować plik konfiguracyjny biblioteki klas jako zewnętrzny i po prostu odwołać się do niego z konfiguracji pliku wykonywalnego).

Więc możesz mieć app.config dla biblioteki klas, ale jest to bezużyteczne, jeśli nie integrujesz go poprawnie z aplikacją nadrzędną ..__ Zobacz tutaj, co kiedyś napisałem: link

0
Mircea Ion

Poleciłbym użyć Properties.Settings do przechowywania wartości takich jak ConnectionStrings i tak dalej w bibliotece klas. W tym miejscu zapisywane są wszystkie ciągi połączenia, sugerowane przez visual studio, gdy próbujesz na przykład dodać adapter tabeli. wprowadź opis zdjęcia tutaj

A potem będą dostępne za pomocą tego kodu w każdym miejscu w bibliotece klas

var cs=  Properties.Settings.Default.[<name of defined setting>];
0
sishanov