Как разрешить ссылку на applicationSettings, когда web.config недоступен - PullRequest
2 голосов
/ 05 августа 2009

Я пытаюсь взять код в веб-сервисе .ASMX и преобразовать его в проект библиотеки классов. В проекте веб-службы есть файл web.config с:

<applicationSettings>
    <myService.Properties.Settings>
        <setting name="DownloadChunkSize" serializeAs="String">
            <value>100000</value>
        </setting>

.. и код в файле FileService.asmx.cs использует это для получения значения:

int chunkSize = (int)Properties.Settings.Default.DownloadChunkSize;

Когда я пытаюсь реструктурировать этот код для устранения веб-службы .asmx, я получаю ошибку времени компиляции в моем проекте библиотеки классов, потому что больше нет доступного web.config. Позвольте мне попытаться объяснить немного больше о том, что я сделал (и почему):

Мотивация для этого заключается в упрощении моих проектов. То есть у меня есть решение Vstudio с проектом .asmx, которое работает. Он имеет несколько методов и инкапсулирует связь с другим веб-сервисом .asmx, предоставляемым поставщиком.

Новый дизайн, который я пытаюсь сделать, выглядит следующим образом:

Проект 1 - это проект библиотеки классов, который называется ProxyASMX и содержит веб-ссылку на веб-службу поставщика. Я не предоставил здесь никакого кода; он просто имеет небольшой app.config, указывающий на веб-сервис поставщика.

Project 2 - это проект библиотеки классов со ссылкой на ProxyASMX.dll. Код в этом файле FileService.cs такой же, как у моего исходного веб-сервиса, но атрибуты [webmethod] были удалены. У меня проблемы с компиляцией этого проекта.

Project 3 - это проект веб-приложения с двумя HTTPHandlers - Upload.ashx и Download.ashx. Этот проект будет иметь ссылку на библиотеку классов Project 2. Я попытался заменить небольшой контент по умолчанию web.config на более полный контент web.config из исходного решения, но когда это не сработало, я подумал, что лучше проконсультироваться с экспертами об этом предприятии.

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

Ответы [ 3 ]

5 голосов
/ 05 августа 2009

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

Поэтому, если я правильно вас понял, вам нужно добавить параметр DownloadChunkSize в Project 2 и скопировать этот раздел в ваш web.config в Project 3. Это будет что-то вроде:

<applicationSettings>
    <Project2.Properties.Settings>
        <setting name="DownloadChunkSize" serializeAs="String">
            <value>100000</value>
        </setting>

Вы можете получить доступ к этому параметру в Project 3, используя:

Project2.Properties.Settings.Default.DownloadChunckSize

И в Project 2:

Properties.Settings.Default.DownloadChunckSize
0 голосов
/ 05 августа 2009

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

Если есть несколько приложений, повторно использующих библиотеку, я, скорее всего, рассмотрю файл конфигурации уровня библиотеки (например, NLog). Однако в большинстве случаев настройка имеет больше смысла, исходя из приложения.

0 голосов
/ 05 августа 2009

Я думаю, что вам нужно создать ExeConfigurationFileMap и использовать его для получения значений из вашего App.config из проекта 1.

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();

        fileMap.ExeConfigFilename = @"ConfigTest.exe.config";  // relative path names possible

        // Open another config file 

        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);



        // read/write from it as usual

        ConfigurationSection mySection = config.GetSection("mySection");

        config.SectionGroups.Clear(); // make changes to it 

        config.Save(ConfigurationSaveMode.Full);  // Save changes

Есть хороший помощник из Enterprise Library для такого рода вещей - Том Холландер сделал хорошую рецензию этого

...