Почему я должен указывать сборку в моем 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 вашего веб-приложения.