Файл Visual C # app.config для ссылочной сборки - PullRequest
1 голос
/ 25 августа 2010

У нас есть решение Visual Studio 2010, которое содержит несколько проектов C # в соответствии с шаблоном Onion Architecture Джеффри Палермо (http://jeffreypalermo.com/blog/the-onion-architecture-part-1/).) У нас есть проект пользовательского интерфейса, который является проектом ASP.Net MVC, и у нас есть класс C # Библиотечный проект под названием Инфраструктура, на который ссылается проект пользовательского интерфейса. В наш проект Инфраструктура мы добавили файл app.config, содержащий параметры, относящиеся к проекту Инфраструктура. Во время выполнения файл app.config, по-видимому, недоступен для проекта Infrastructure, только файл web.config, содержащийся в проекте UI. Мы не хотим помещать настройки, относящиеся к проекту Infrastructure, в файл web.config в проекте UI, пользовательский интерфейс не нуждается в этих настройках Как мы можем сделать файл app.config инфраструктуры доступным во время выполнения? Мы подумали, может быть, нам следует поместить копию сборки после копирования, чтобы скопировать app.config в каталог пользовательского интерфейса при сборке приложения - это правильный путь? это или есть лучший способ?

Ответы [ 2 ]

6 голосов
/ 26 августа 2010

Как правило, вам скажут, что это невозможно сделать. Однако вы, безусловно, можете загрузить файл конфигурации, используя метод System.Configuration.ConfigurationManager.OpenExeConfiguration. Вы можете передать путь к файлу к вашей сборке (это не обязательно должен быть исполняемый файл, несмотря на имя метода).

Конечно, это не объединяет настройки конфигурации вашей сборки с настройками конфигурации исполняемого приложения, и я не думаю, что это должно. Ваша сборка просто должна знать, что ей нужно получить свои настройки с помощью другого механизма, нежели функция System.Configuration.ConfigurationManager.GetSection или статическое свойство AppSettings для этого класса.

Ниже приведен очень простой пример для класса «Настройки», который загружает файл .config, для сборки которого он является частью.

public static class Settings
{
    public static System.Configuration.Configuration Configuration { get; private set; }

    static Settings()
    {
        // load a .config file for this assembly
        var assembly = typeof(Settings).Assembly;
        Configuration = System.Configuration.ConfigurationManager.OpenExeConfiguration(assembly.Location);

        if (Configuration == null)
            throw new System.Configuration.ConfigurationErrorsException(string.Format("Unable to load application configuration file for the assembly {0} at location {1}.", assembly.FullName, assembly.Location));
    }

    // This function is only provided to simplify access to appSettings in the config file, similar to the static System.Configuration.ConfigurationManager.AppSettings property
    public static string GetAppSettingValue(string key)
    {
        // attempt to retrieve an appSetting value from this assembly's config file
        var setting = Configuration.AppSettings.Settings[key];
        if (setting != null)
            return setting.Value;
        else
            return null;
    }
}

И использование ...

public class UsageExample
{
    void Usage()
    {
        string mySetting = Settings.GetAppSettingValue("MySetting");

        var section = Settings.Configuration.GetSection("MySection");
    }
}

Теперь вам все еще придется решать проблемы сборки. Добавление элемента «Файл конфигурации приложения» (App.config) в сборку библиотеки классов приводит к тому, что Visual Studio копирует его в выходную папку этой сборки как .dll.config, но он не копируется автоматически в выходную папку каких-либо исполняемых приложений. что ссылка на этот проект. Поэтому вам нужно добавить шаг после сборки, чтобы скопировать файл в соответствующее место, как вы упоминали.

Я бы подумал о том, чтобы выполнить шаг после сборки для библиотеки классов, которая скопирует файл .config в папку «Configurations» уровня решения, а затем сделаю шаг после сборки для исполняемых проектов, чтобы скопировать все из «» Конфигурации »в папку вывода. Я не уверен, что это действительно сработает, но если это сработает, вы не будете создавать дополнительные зависимости между проектами на этапах после сборки (это может затруднить обслуживание).

РЕДАКТИРОВАТЬ: В конечном счете, вы должны подумать, действительно ли это то, что вы хотите делать. Это не обычный подход, и, как правило, вам лучше обойтись, если использовать другой ответ на этот вопрос, который упоминается при использовании атрибута configSource.

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

2 голосов
/ 25 августа 2010

Даже если вы скопируете app.config после сборки, это не решит вашу проблему. Приложение все еще является веб-приложением, поэтому система конфигурации будет использовать файл web.config. Настройки должны будут войти туда так или иначе. Один из способов сохранить эти настройки немного отдельно - поместить их в пользовательский раздел конфигурации, а затем поместить параметры для этого раздела в отдельный файл. На него по-прежнему нужно ссылаться из web.config (используя атрибут configSource).

...