перемещение файлов конфигурации для DLL в приложение, которое вызывает DLL - PullRequest
5 голосов
/ 19 марта 2012

У меня есть веб-приложение с функцией поиска.Алгоритм поиска компилируется в отдельную dll.В коде C # для алгоритма поиска я использую строки, хранящиеся в файле настроек, чтобы указать каталог, в котором находится поисковый индекс.Как только код поиска скомпилирован, информация о настройках включается в Search.dll.config, который помещается в каталог bin вместе с Search.dll.Теперь в моем веб-приложении я добавляю Search.dll к ссылкам.Файл конфигурации не добавляется в веб-приложение.Однако веб-приложение работает нормально и знает, где находится файл.Поскольку внутри Settings.Designer он использует DefaultSettingValueAttribute, чтобы назначить значение по умолчанию, если файл конфигурации отсутствует.

Как мне также добавить Search.dll.config в мое веб-приложение, чтобы оператор мог изменить местоположениеиндексировать файлы на сервере как нужно?

Спасибо

РЕДАКТИРОВАТЬ:

Я попытался добавить файл конфигурации в мою папку развертывания.Но ASP.NET помещает библиотеки в каталог по адресу C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files \ root ...... и файл конфигурации не копируется туда.Поэтому на данный момент я не знаю, как включить файл конфигурации в мой код.

Спасибо за вашу помощь.

Примечание:

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

    var executingAssembly = System.Reflection.Assembly.GetExecutingAssembly();
    var location = executingAssembly.Location; //C:\MyApp\bin\Debug\Search.dll
    var config = ConfigurationManager.OpenExeConfiguration(location);
    var sections = config.Sections; //count of this is 21
    ConfigurationSectionGroup csg = config.GetSectionGroup("applicationSettings");
    ConfigurationSectionCollection csc = csg.Sections;
    ConfigurationSection cs = csc.Get("Search.Properties.Settings");

Ответы [ 3 ]

5 голосов
/ 01 июня 2013

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

В большинстве сценариев вы можете избавиться от зависимости / чтения из конфигурации в коде dll, используя внедрение зависимостей либо через DI-контейнер, либо через ручную компоновку.

если ваша dll поиска зависит от настроек, сделайте настройки зависимостью для вашего класса точки входа dll и перейдите к коду dll, предполагая, что ваш класс точки входа каким-то образом получает свои настройки.

Затем вы можете указать значение настроек из вашего приложения, будь то web / windows / console и считав из файла конфигурации / db / web service / file system.

пример кода:

В dll:

 public interface ISearcherDirectorySettings
{
    string[] SearchIndexPointers { get; }
}

public class Searcher
{
    private readonly ISearcherDirectorySettings _searchDirctorySettings;

    public Searcher(ISearcherDirectorySettings searchDirtorySettings)
    {
        _searchDirctorySettings = searchDirtorySettings;
    }

    public void SearchAlgorithm()
    {
        var indexes = _searchDirctorySettings.SearchIndexPointers;
        // search code
    }
}

В вашей заявке:

public class SearcherDirectorySettings : ISearcherDirectorySettings
{
    private readonly string[] _pointers;
    public SearcherDirectorySettings(string[] pointers)
    {
        _pointers = pointers;
    }

    public string[] SearchIndexPointers
    {
        get { return _pointers; }
    }
}

public class ApplicationRootClass //Owns configuration file
{
    const string FirstPointerKey = "File1";
    const string SecondPointerKey = "File2";

    private Func<string, string> _getFromConfig = key => ConfigurationManager.AppSettings[key];

    public ApplicationRootClass()
    {
        var searcherDirectorySettings = new SearcherDirectorySettings(new[] { _getFromConfig(FirstPointerKey),_getFromConfig(SecondPointerKey) });

        var searcher = new Searcher(searcherDirectorySettings);
        searcher.SearchAlgorithm();
    }
}

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

Если вы в конечном итоге используете dll в нескольких приложениях / проектах и ​​дублируете код класса настроек, у вас есть служебный компонент, который выполняет эту работу, или перемещаете класс настроек в dll, но оставляете экземпляр класса настроек для приложения.

5 голосов
/ 21 марта 2012

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

EDIT:

Для этого в свойствах файла задайте для параметра «Действие построения» значение «Содержимое» и «Копировать в выходной каталог» в качестве «Копировать, если новее». Вы можете найти файл в папке bin, используя HttpRuntime.BinDirectory. Возможно, вы захотите передать это местоположение своей библиотеке, а не заставлять библиотеку предполагать, что она работает в веб-проекте.

В качестве альтернативы просто вставьте нужный файл конфигурации в файл web.config (в конфигурационных файлах также есть возможность разбить настройки на отдельный файл).

Наконец, вы можете рассмотреть возможность встраивания файла в качестве ресурса.

EDIT:

Глядя на код, который вы используете, просто переместите его в web.config. Гораздо проще и идиоматичнее. Как только он появится в web.config, просто используйте ConfigurationManager.GetSection(), чтобы прочитать ваш раздел.

Кстати, есть бесплатный конструктор разделов конфигурации, который делает создание классов для поддержки пользовательских разделов конфигурации очень простым. Посмотрите в онлайн-галерее VS Extensions здесь:

http://visualstudiogallery.msdn.microsoft.com/2a69f74e-83df-4eb0-8cac-cd83b451cd1d?SRC=VSIDE

1 голос
/ 02 мая 2014

Вот как вы делаете то, что хотите, в отличие от того, что некоторые думают, что вы должны делать:

(извините, я сейчас работаю в vb)

Скажите, что dll назван mycompany.mynamespace.dll

  1. Переименуйте файл app.config в своем проекте dll в mycompany.mynamespace.dll.config
  2. В его свойствах скажем Копировать, если новее
  3. Используйте этот код (в dll) для доступа к вашим настройкам:

        Dim appConfig = ConfigurationManager.OpenExeConfiguration(Me.GetType.Assembly.Location)
        _WorkingDirectory = appConfig.AppSettings.Settings("WorkingDirectory").Value
    
...