app.config для библиотеки классов - PullRequest
63 голосов
/ 15 апреля 2011

Я не вижу файл app.config, созданный для библиотеки классов мастером VS2008. В своем исследовании я обнаружил, что в приложении существует только один app.config.

Плохо ли добавлять app.config вручную в библиотеку классов или есть какие-либо другие методы, которые будут использоваться для app.config в библиотеке классов?

Мне нужно хранить информацию о конфигурации log4net в файле app.config.

Ответы [ 9 ]

81 голосов
/ 15 апреля 2011

Как правило, не необходимо добавить app.config файл в проект библиотеки классов;он не будет использоваться без каких-либо болезненных изгибов и скручиваний с вашей стороны.Он не повредит проекту библиотеки вообще - он просто ничего не сделает.

Вместо этого вы настраиваете приложение, использующее вашу библиотеку;поэтому требуемая информация о конфигурации будет там.Каждое приложение, которое может использовать вашу библиотеку, вероятно, будет иметь разные требования, так что это также имеет логический смысл.

43 голосов
/ 01 сентября 2011

Я не знаю, почему этот ответ еще не был дан:

Разные абоненты одной и той же библиотеки, как правило, будут использовать разные конфигурации.Это подразумевает, что конфигурация должна находиться в исполняемом приложении , а не в библиотеке классов.

Вы можете создать app.config в проекте библиотеки классов.Он будет содержать конфигурации по умолчанию для элементов, которые вы создаете в библиотеке.Например, он будет содержать строки подключения, если вы создадите модель Entity Framework в библиотеке классов.

Однако эти параметры не будут использоваться исполняемым приложением, вызывающим библиотеку.Вместо этого эти параметры можно скопировать из файла library.dll.config в файл app.config или web.config вызывающего абонента, чтобы их можно было изменить в зависимости от конкретного вызывающего абонента и среды, в которой он находится.развернут.

Так было с .NET с первого дня.

35 голосов
/ 01 сентября 2011

Джон, было высказано много мнений, которые не правильно ответили на ваш вопрос.

Я выскажу МНЕНИЕ, а затем расскажу, как сделать именно то, что вы просили.

Я не вижу причин, по которым сборка не может иметь свой собственный файл конфигурации.Почему первый уровень atomicy (это настоящее слово?) Находится на уровне приложения?Почему не на уровне решения?Это произвольное решение, основанное на догадках, и, как таковое, МНЕНИЕ.Если вы хотите написать библиотеку журналов и захотите включить в нее файл конфигурации, который будет использоваться глобально, почему вы не можете подключиться к встроенным функциям настроек?Мы все сделали это ... пытались предоставить "мощную" функциональность другим разработчикам.Как?Делая предположения, которые по своей сути переводятся на ограничения.Это именно то, что MS сделала со структурой настроек, поэтому вам нужно немного «обмануть».

Чтобы напрямую ответить на ваш вопрос, просто добавьте файл конфигурации вручную (xml) и назовите его так, чтобы он соответствовал вашей библиотеке.и включить расширение "config".Пример:

MyDomain.Mylibrary.dll.Config

Далее используйте ConfigurationManager для загрузки файла и доступа к настройкам:

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

Обратите внимание, что это полностью поддерживает компьютерИерархия .config, даже если вы явно выбрали файл конфигурации приложения.Другими словами, если настройка отсутствует, она разрешится выше.Настройки также переопределяют записи machine.config.

6 голосов
/ 01 июня 2015

Если вы хотите настроить ведение журнала проекта, используя log4Net, при использовании библиотеки классов, в действительности нет необходимости в каком-либо файле конфигурации.Вы можете настроить свой регистратор log4net в классе и использовать этот класс в качестве библиотеки.

Поскольку log4net предоставляет все параметры для его настройки.

Пожалуйста, найдите код ниже.

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;
      }

Теперь вместо вызова XmlConfigurator.Configure (новый FileInfo ("app.config")) вы можете напрямую вызвать SetLogger с желаемым путем и шаблоном для установки регистратора в функции запуска приложения Global.asax.

И используйте приведенный ниже код для регистрации ошибки.

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

Используя следующий код, вам не нужно писать ни одной строки ни в приложении web.config, ни в приложении.конфигурация библиотеки.

5 голосов
/ 15 апреля 2011

Фактически, библиотека классов, которую вы реализуете, извлекает информацию из app.config внутри приложения, которое ее потребляет, поэтому наиболее правильный способ реализации конфигурации для библиотек классов в .net в VS должен подготовить app.config в приложении для настройки всего, что он потребляет, например, конфигурации библиотек.

Я немного поработал с log4net и обнаружил, что у того, кто готовил приложение, всегда был раздел для конфигурации log4net внутри main app.config .

Надеюсь, вы найдете эту информацию полезной.

До встречи и оставляйте комментарии о найденном решении.

EDIT:

По следующей ссылке у вас есть app.config с разделом для log4net:

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

4 голосов
/ 26 июля 2015

На самом деле, в некоторых редких случаях вы можете хранить app.config в библиотеках классов (путем добавления вручную) и анализировать его по OpenExeConfiguration .

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

Вы должны действительно оценить реальноенеобходимость этого.Для абстрактных данных это не лучшее решение, но «Разделы конфигурации» могут быть очень полезными !!

Например, мы организовали нашу N-ярусную архитектуру WCF без каких-либо метаданных, просто используя Unity Container и InjectionФабрика основана на Channel Factory T. Мы добавили внешнюю библиотеку ClassLibrary dll с помощью только [Service Contract] интерфейсов и общего app.config, чтобы читать конечные точки из клиентского раздела и легко добавлять / изменять их в одном месте.

3 голосов
/ 13 июля 2015

Вы хотите добавить App.config в вашу тестовую библиотеку классов, если вы используете трассировщик / регистратор. В противном случае ничего не регистрируется , когда вы запускаете тест через тестовый прогон, такой как TestDriven.Net.

Например, я использую TraceSource в своих программах, но выполнение тестов не регистрируетчто угодно, если только я не добавлю файл App.config с конфигурацией trace / log в библиотеку классов теста.

В противном случае добавим App.config в библиотеку классовничего не делает.

2 голосов
/ 08 декабря 2018

Ответом для создания app.config без ручного управления является вкладка Свойства / настройки проекта Visual Studio.

Когда вы добавляете параметр и сохраняете, ваш app.config будет создан автоматически. На этом этапе в пространстве имен { yourclasslibrary .Properties} создается набор кода, содержащий свойства, соответствующие вашим настройкам. Сами настройки будут размещены в настройках приложения 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>

Если вы добавили параметр области приложения под названием Setting1 = 3, то будет создано свойство с именем Setting1. Эти свойства становятся частью компиляции двоичного файла, и они украшены DefaultSettingValueAttribute , для которого установлено значение, указанное вами во время разработки.

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

Таким образом, как и в коде вашей библиотеки классов, вы используете эти свойства, если соответствующая настройка не существует в конфигурационном файле среды выполнения, она будет использовать значение по умолчанию. Таким образом, приложение не будет аварийно завершать работу из-за отсутствия записи настройки, что очень запутанно, когда вы не знаете, как все это работает. Теперь вы спрашиваете себя, как можно указать наше собственное новое значение в развернутой библиотеке и избежать использования значения по умолчанию?

Это произойдет, когда мы правильно настроим исполняемый файл app.config. Два шага 1. мы понимаем, что у нас будет раздел настроек для этой библиотеки классов, и 2. с небольшими изменениями вставляем файл конфигурации библиотеки классов в исполняемый файл конфигурации. (есть метод, в котором вы можете сохранить внешний файл конфигурации библиотеки классов и просто ссылаться на него из конфигурации исполняемого файла.

Итак, вы можете иметь app.config для библиотеки классов, но это бесполезно, если вы не интегрируете ее должным образом с родительским приложением. Смотрите здесь, что я написал некоторое время назад: ссылка

1 голос
/ 15 апреля 2011

Нет автоматического добавления файла app.config при добавлении проекта библиотеки классов в ваше решение.

Насколько мне известно, нет никаких указаний на то, чтобы делать это вручную. Я думаю, что это общее использование.

Что касается конфигурации log4Net, вам не нужно помещать конфигурацию в app.config, вы можете иметь выделенный файл conf в вашем проекте, а также файл app.config одновременно.

эта ссылка http://logging.apache.org/log4net/release/manual/configuration.html даст вам примеры обоих способов (раздел app.config и автономный файл log4net conf)

...