app.config dla biblioteki klas

Nie widzę aplikacji.plik konfiguracyjny wygenerowany dla biblioteki klas przez kreatora VS2008. W moich badaniach odkryłem, że w aplikacji tylko jedna aplikacja.config istnieje.

Czy dodawanie aplikacji jest złe?skonfiguruj ręcznie do biblioteki klas lub czy są jakieś inne metody, które będą służyć celowi aplikacji.config w bibliotece klasowej?

Muszę przechowywać informacje konfiguracyjne log4net wewnątrz aplikacji.plik konfiguracyjny.

Author: John Saunders, 2011-04-15

10 answers

Powinieneś nie dodawać plik app.config do projektu biblioteki klas; nie będzie on używany bez bolesnego zginania i skręcania z twojej strony. Nie zaszkodzi to w ogóle projektowi bibliotecznemu - po prostu nic nie zrobi.

Zamiast tego konfigurujesz aplikację, która korzysta z twojej Biblioteki; tak więc wymagane informacje konfiguracyjne trafią tam. Każda aplikacja, która może korzystać z twojej Biblioteki, prawdopodobnie będzie miała inne wymagania, więc to naprawdę sprawia, że logiczne też.

 102
Author: Andrew Barber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 17:37:41

Nie wiem dlaczego tej odpowiedzi jeszcze nie udzielono:

Różni wywołujący tę samą bibliotekę będą na ogół używać różnych konfiguracji. Oznacza to, że konfiguracja musi znajdować się w aplikacji wykonywalnej, a nie w bibliotece klas.

Możesz utworzyć aplikację.config wewnątrz projektu biblioteki klas. Będzie zawierać domyślne konfiguracje dla elementów utworzonych w bibliotece. Na przykład, będzie zawierać ciągi połączeń, jeśli utworzysz Model struktury encji w bibliotece klas.

Jednak te ustawienia nie będą używane przez program wykonywalny wywołujący bibliotekę. Zamiast tego ustawienia te mogą być skopiowane z biblioteki.dll.plik konfiguracyjny do aplikacji.config lub web.konfiguracja wywołującego, tak aby mogły być zmieniane tak, aby były specyficzne dla wywołującego i dla środowiska, w którym wywołujący jest wdrożony.

Tak jest z. NET od pierwszego dnia.

 51
Author: John Saunders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 20:34:51

Jon, padło wiele opinii, które nie odpowiadały poprawnie na twoje pytanie.

Dam swoją opinię, a potem powiem Ci, jak zrobić dokładnie to, o co prosiłeś.

Nie widzę powodu, dla którego assembly nie mógłby mieć własnego pliku konfiguracyjnego. Dlaczego pierwszy poziom atomicy (czy to prawdziwe słowo?) być na poziomie aplikacji? Dlaczego nie na poziomie rozwiązania? Jest to decyzja arbitralna, najlepiej zgadująca i jako taka, opinia. Jeśli masz napisać bibliotekę logowania i chcesz dołączyć plik konfiguracyjny dla niego, który byłby używany globalnie, dlaczego nie można podłączyć do wbudowanej funkcji ustawień? Wszyscy to zrobiliśmy ... starałem się zapewnić" potężną " funkcjonalność innym programistom. Jak? Dokonując założeń, które z natury przekładają się na ograniczenia. To dokładnie to, co MS zrobił z frameworkiem ustawień, więc musisz trochę "oszukać".

Aby bezpośrednio odpowiedzieć na twoje pytanie, po prostu dodaj plik konfiguracyjny ręcznie (xml) i nazwij go tak, aby pasował do twojego biblioteki oraz dołączenie rozszerzenia "config". Przykład:

MyDomain.Mylibrary.dll.Config

Następnie użyj ConfigurationManager, aby załadować plik i ustawienia dostępu:

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 maszynę.Config heier, mimo że wyraźnie wybrałeś plik konfiguracyjny aplikacji. Innymi słowy, jeśli ustawienie nie istnieje, to rozwiąże się wyżej. Ustawienia będą również nadpisywać maszynę.wpisy konfiguracyjne.

 43
Author: Todd Beaulieu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 01:29:51

W rzeczywistości Biblioteka klas, którą implementujesz, pobiera informacje z aplikacji .config wewnątrz aplikacji, która go zużywa, więc najbardziej poprawnym sposobem implementacji konfiguracji dla bibliotek klas w. Net W VS jest przygotowanie aplikacji.config w aplikacji do konfiguracji wszystkiego, co zużywa, jak konfiguracja bibliotek.

Pracowałem trochę z log4net, i okazało się, że ten, który przygotował aplikację zawsze miał sekcję dla log4net konfiguracja wewnątrz głównej aplikacji .config .

Mam nadzieję, że ta informacja okaże się przydatna.

Do zobaczenia i zamieść komentarze na temat znalezionego rozwiązania.

EDIT:

Pod następnym linkiem MASZ aplikację.config z sekcją log4net:

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

 6
Author: Amedio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-31 20:30:51

Jeśli chcesz skonfigurować rejestrowanie projektu za pomocą log4Net, podczas korzystania z biblioteki klas, nie ma potrzeby używania żadnego pliku konfiguracyjnego. Możesz skonfigurować log4net logger w klasie i używać tej klasy jako biblioteki.

Ponieważ log4net udostępnia wszystkie opcje konfiguracji.

Proszę znaleźć kod poniżej.

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 (new FileInfo ("app.config")) możesz bezpośrednio wywołać SetLogger z żądaną ścieżką i wzorcem do Ustawienia logger w Global.funkcja uruchamiania aplikacji asax.

I 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 poniższego kodu nie musisz pisać ani jednej linii ani w aplikacji web.config ani wewnątrz aplikacji.konfiguracja biblioteki.

 6
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 05:34:21

Właściwie, w niektórych rzadkich przypadkach można przechowywać aplikację.config w bibliotekach klas (przez dodanie ręcznie) i parse it by OpenExeConfiguration .

 var fileMap =
    new ExeConfigurationFileMap {ExeConfigFilename = 
    @"C:\..somePath..\someName.config"};
 System.Configuration.Configuration config =
    ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
    ConfigurationUserLevel.None);
Powinieneś naprawdę oszacować prawdziwą potrzebę tego. Dla abstrakcyjnych danych nie jest to najlepsze rozwiązanie, ale "sekcje konfiguracyjne" mogą być bardzo przydatne!!

Na przykład, zorganizowaliśmy naszą N-warstwową architekturę WCF odsprzęgniętą, bez żadnych metadanych, po prostu używając Unity Container i Injection Factory w oparciu o Channel Factory T. dodaliśmy externall ClassLibrary dll z tylko [umowy serwisowej] interfejsów i wspólnej aplikacji.config w celu odczytu punktów końcowych z clientsection i łatwego dodawania/zmiany ich w jednym miejscu.

 4
Author: Roma Borodov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Chcesz dodać aplikację.config do biblioteki klas tests, Jeśli używasz znacznika / loggera. w przeciwnym razie nic nie jest rejestrowane podczas wykonywania testu przez biegacza testowego, takiego jak TestDriven.Net.

Na przykład używam TraceSource w moich programach, ale Uruchamianie testów niczego nie rejestruje, chyba że dodam aplikację .plik config z konfiguracją trace / log do biblioteki klas testowych.

W Przeciwnym Razie, dodanie aplikacji.config do biblioteki klas nic nie robi.

 3
Author: Daniel A.A. Pelsmaeker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 17:14:09

Twoja odpowiedź na nie ręczne tworzenie aplikacji.config to zakładka właściwości/ustawienia projektu Visual Studio.

Po dodaniu ustawienia i zapisaniu, aplikacja.config zostanie utworzony automatycznie. W tym momencie kilka kodu jest generowany w {yourclasslibrary.Properties} przestrzeń nazw zawierająca właściwości odpowiadające Twoim ustawieniom. Same ustawienia zostaną umieszczone w aplikacji.ustawienia applicationSettings 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 dodałeś zakres aplikacji ustawienie setting1 = 3 wtedy zostanie utworzona właściwość Setting1. Te właściwości stają się w momencie kompilacji częścią pliku binarnego i są ozdobione DefaultSettingValueAttribute, która jest ustawiona na wartość określoną w czasie tworzenia.

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

Tak jak w kodzie biblioteki klas, korzystasz z tych właściwości, jeśli odpowiednie ustawienie nie istnieje w pliku konfiguracyjnym runtime, będzie to alternatywą dla użycia wartości domyślnej. W ten sposób aplikacja nie zawiesi się za brak wpisu ustawienia, co jest bardzo mylące po raz pierwszy, gdy nie wiesz, jak te rzeczy działają. Teraz zadajesz sobie pytanie, Jak określić własną nową wartość we wdrożonej bibliotece i uniknąć użycia domyślnej wartości ustawienia?

Stanie się to, gdy poprawnie skonfigurujemy aplikację wykonywalną.config. Dwa kroki. 1. uświadamiamy sobie, że będziemy mieli sekcję ustawień dla tej biblioteki klas i 2. z małymi modyfikacjami wklejamy plik konfiguracyjny biblioteki klas w pliku wykonywalnym config. (istnieje metoda, w której możesz zachować plik konfiguracyjny biblioteki klas Na zewnątrz i po prostu odwoływać się do niego z konfiguracji pliku wykonywalnego.

Więc możesz mieć aplikację.config dla biblioteki klas, ale jest bezużyteczny, jeśli nie integrujesz go poprawnie z aplikacją nadrzędną. Zobacz co napisałem jakiś czas temu: link
 2
Author: Mircea Ion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-08 06:09:15

Nie ma automatycznego dodawania aplikacji.plik konfiguracyjny po dodaniu projektu biblioteki klas do rozwiązania.

Według mojej wiedzy, nie ma przeciwwskazań, aby zrobić to ręcznie. Myślę, że jest to powszechne użycie.

Jeśli chodzi o konfigurację log4Net, nie musisz umieszczać konfiguracji w aplikacji.config, możesz mieć dedykowany plik conf w swoim projekcie, a także aplikację.plik konfiguracyjny w tym samym czasie.

Ten link http://logging.apache.org/log4net/release/manual/configuration.html poda przykłady dotyczące obu dróg (sekcja w aplikacji.konfiguracja i samodzielny plik konf log4net)

 1
Author: Bruno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 09:58:24

Polecam korzystanie z właściwości.Ustawienia do przechowywania wartości takich jak ConnectionStrings itd. wewnątrz biblioteki klas. To jest miejsce, w którym wszystkie ciągi połączeń są przechowywane przez sugestię z visual studio, gdy próbujesz dodać adapter tabeli na przykład. Wpisz tutaj opis obrazka

I wtedy będą one dostępne za pomocą tego kodu co gdzie w bibliotece clas

var cs=  Properties.Settings.Default.[<name of defined setting>];
 0
Author: sishanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-03 10:04:57