Проблема с регистрацией контейнера .Net Native IoC в режиме выпуска

Приложение работает, как и положено, в режиме отладки.

В режиме выпуска я получаю сообщение об исключении

Возникло исключение: Autofac.Core.Registration.ComponentNotRegisteredException в Autofac.dll

Дополнительная информация: Запрошенная служба 'Microsoft.Extensions.Options.IOptions`1 [[TIKSN.GroceryChecklist.Models.Configuration.HockeyAppConfiguration, Models, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]]' не зарегистрирована . Чтобы избежать этого исключения, либо зарегистрируйте компонент для предоставления услуги, проверьте регистрацию службы с помощью IsRegistered (), либо используйте метод ResolveOptional () для разрешения необязательной зависимости.

Это строка, которая вызывает исключение

var hockeyAppOptions = serviceProvider.GetRequiredService<IOptions<HockeyAppConfiguration>>();

Но этот параметр настроен и отлично работает в режиме отладки.

services.Configure<HockeyAppConfiguration>(option =>
        {
            option.AppID = "my key";

        });

Я также попытался добавить строку регистрации типа в файл Default.rd.xml, но это тоже не сработало.

<Type Name="Microsoft.Extensions.Options.IOptions{TIKSN.GroceryChecklist.Models.Configuration.HockeyAppConfiguration}" Dynamic="Required Public" />

person TIKSN    schedule 09.09.2016    source источник


Ответы (1)


Я нашел решение. Я добавил эту строку и запустил режим отладки.

Debug.WriteLine($"hockeyAppOptions.Type is {hockeyAppOptions.GetType().FullName}");

Результат был

hockeyAppOptions.Type is Microsoft.Extensions.Options.OptionsManager`1[[TIKSN.GroceryChecklist.Models.Configuration.HockeyAppConfiguration, Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Поэтому я заменил предыдущее, как в RD.XML, на

<Type Name="Microsoft.Extensions.Options.OptionsManager{TIKSN.GroceryChecklist.Models.Configuration.HockeyAppConfiguration}" Dynamic="Required Public" />

И это сработало.

person TIKSN    schedule 09.09.2016
comment
Привет! Очень рад видеть, что вы не заблокированы. Предположительно мы (компилятор .NET Native) можем здесь лучше справиться. В качестве альтернативы, в Autofac можно внести небольшое изменение, которое поможет нам провести правильный анализ. Я сделаю заметку, чтобы исследовать некоторые варианты и при необходимости использовать Autofac. - person MattWhilden; 10.09.2016