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

У меня есть пользовательские разделы в моем проекте. Следующая строка работает для моего проекта Web API из web.config:

...
  <sectionGroup name="Project.Models">
    <section name="product" type="Project.Models.Configuration.ProductSettings" />
  </sectionGroup>
</configSections>  
<Project.Models>
   <product id="1" />    
</Project.Models>

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

System.Configuration.ConfigurationErrorsException: произошла ошибка при создании обработчика раздела конфигурации для Project.Models/product: не удалось загрузить тип 'Project.Models.Configuration.ProductSettings' из сборки 'System.Configuration, Version=4.0.0.0, Culture= нейтральный, PublicKeyToken=b03f5f7f11d50a3a'. Не удалось загрузить тип 'Project.Models.Configuration.ProductSettings' из сборки 'System.Configuration, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a'.

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

<section name="product" type="Project.Models.Configuration.ProductSettings, Project.Models" />

1 ответ

Решение

Это зависит от хоста, который выполняет ваш код.

Без дополнительной сантехники вы обнаружите, что во внутренней работе пространства имен Configuration type атрибут подается в статический метод Type.GetType(string typeName),

Для параметра typeName вы найдете его описание:

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

Ключевая часть в данный момент выполняет сборку. Похоже, что это никогда не относится к обычным доменам приложений и, следовательно, к приложению, которое запускает ваш юнит-тест (который, я полагаю, является VS).

Веб-хостинг ASP.NET, с другой стороны, обеспечивает внутренний HttpConfigurationSystem класс, который повторно реализует вызовы GetSection, Это немного трудно следовать, но это похоже на внутренний класс BuildManager загружает все сборки и перебирает все типы, чтобы найти тот, который соответствует.

Это объясняет разницу в поведении. Рекомендуется всегда указывать имя сборки. В сценарии asp.net, если имя параметра присутствует в параметре типа, оно закорачивает Type.GetType вызов, который предотвращает загрузку и проверку всех DLL в папке bin вашего веб-приложения.

Другие вопросы по тегам