2015-07-24 5 views
0

У меня есть пользовательские разделы в моем проекте. Следующая строка работает для моего веб-API проекта из web.config:Почему мне нужно указывать сборку в моем app.config, но не для моего 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 : An error occurred creating the configuration section handler for Project.Models/product: Could not load type 'Project.Models.Configuration.ProductSettings' from assembly 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Could not load type 'Project.Models.Configuration.ProductSettings' from assembly 'System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.

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

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

ответ

1

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

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

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

If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.

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

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

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