Nancy: Невозможно использовать шаблон IOptions с Nancy / TinyIoc

Созданный на 25 янв. 2016  ·  6Комментарии  ·  Источник: NancyFx/Nancy

Я пытаюсь реализовать шаблон параметров (как рекомендовано здесь: https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects) в проекте с NancyFX / TinyIOC, но это не так. работающий.

Я регистрирую параметры в методе Startup.cs / ConfigureServices, но когда я пытаюсь ввести параметры в свой класс, TinyIoc выдает исключение Nancy.TinyIoc.TinyIoCResolutionException: невозможно разрешить тип: AppSettings.

Я думаю, это связано с тем, что шаблон параметров использует Microsoft.Extensions.DependencyInjection, но Нэнси использует TinyIoc по умолчанию, поэтому TinyIoc пытается разрешить IOptions и терпит неудачу.

Есть ли способ использовать IOptions <> с TinyIoc?

В худшем случае, могу ли я заменить TinyIoc на MS DependencyInjection?

Вот мой код:

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

MyService.cs:

public SearchService(IOptions<AppSettings> config)
{
}

Ошибка:

Application startup exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Something went wrong when trying to satisfy one of the dependencies during composition, make sure that you've registered all new dependencies in the container and inspect the innerexception for more details. ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.NancyEngine ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.DefaultRequestDispatcher ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.DefaultRouteResolver ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.RouteCache ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: MyProject.MyService ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Microsoft.Extensions.OptionsModel.IOptions 1 [[MyProject.AppSettings, MyProject, Версия = 1.0.0.0, Культура = нейтральный, PublicKeyToken = null]] «

Дополнительная информация:

"dependencies": {
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.Owin": "1.0.0-rc1-final",
    "Nancy": "1.4.3",
    "Microsoft.Framework.ConfigurationModel": "1.0.0-beta4",
    "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta4",
    "Microsoft.Extensions.OptionsModel": "1.0.0-rc1-final"
},

Версия среды выполнения DNX:

1.0.0-rc1-update1 mono

Большое тебе спасибо.

Самый полезный комментарий

@RTodorov Возможно, уместно создать библиотеку загрузчика Nancy, которая использует Microsoft.Extensions.DependencyInjection в качестве контейнера вместо TinyIoC, это уже сделано для многих различных контейнеров.

Все 6 Комментарий

Вы не регистрируете IOptionsв контейнер Нэнси куда угодно, так что это не сработает, я не уверен, что это за "волшебные" службы. Настроить(Configuration.GetSection ("AppSettings")); "выполняется под капотом, но вам нужно будет зарегистрировать этот тип в контейнере Нэнси одним из следующих способов:

  • Создание собственного загрузчика с передачей IOptionsв его ctor, используя тот загрузчик, в котором вы настраиваете использование Nancy, затем в регистре загрузчика, который находится в ConfigureApplicationContainer
  • Если есть другие типы, которые вы хотите поделиться, сделайте то же, что и выше, но вместо передачи типов передайте вновь настроенный TinyIocContainer, а затем верните этот экземпляр для GetApplicationContainer в производном начальном загрузчике.

Надеюсь, это имеет смысл.

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

Nancy.TinyIoc.TinyIoCContainer.Current.Register(typeof(IOptions<>), typeof(OptionsManager<>));

Что, кстати, то, что services.AddOptions(); делает под капотом для Microsoft.Extensions.DependencyInjection

Это то, что вы имеете в виду?

services.Configure () возьмет загруженную конфигурацию и зарегистрируется в MS DI, когда кому-то потребуется AppSettings.

Я добавил это в кастомную загрузку:

container.Register<IOptions<ElasticSearchConfig>, OptionsManager<ElasticSearchConfig>>();

и теперь ошибка больше не возникает, но, к сожалению, объект создается пустым.

При отладке я понял, что это вернет правильный заполненный объект:

`var appSettings = app.ApplicationServices.GetService> (); ``

Но это вернет пустой объект:

var appSettings = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve<IOptions<AppSettings>>();

Тем не менее, TinyIoc заменяет Ms Framework DI, когда я запрашиваю IOptions.. Я также понял, что все библиотеки Microsoft. * Находятся в списке игнорирования TinyIoc, значит ли это, что он не должен «отвечать», когда я прошу Microsoft.Extensions.OptionsModel.IOptions ?

Как я сказал изначально, вам нужно передать этот экземпляр типа или сконфигурированный контейнер, это бесполезно, просто регистрируя сам тип, поскольку он должен быть сконструирован фабрикой GetService.

Эй, теперь я понял, что ты сказал, это сработало! Я отправил IApplicationBuilder в пользовательский загрузчик и оттуда зарегистрировал IOptions<AppSettings> со значением, возвращенным из ApplicationServices.GetService() .

Я не уверен, что это лучшее решение, поскольку TinyIoc будет действовать как шлюз между моей службой и Microsoft.Extensions.DependencyInjection .

@RTodorov Возможно, уместно создать библиотеку загрузчика Nancy, которая использует Microsoft.Extensions.DependencyInjection в качестве контейнера вместо TinyIoC, это уже сделано для многих различных контейнеров.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги