Я пытаюсь реализовать шаблон параметров (как рекомендовано здесь: 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
Большое тебе спасибо.
Вы не регистрируете IOptions
Надеюсь, это имеет смысл.
Я попробовал зарегистрироваться, выполнив следующие действия:
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.Extensions.OptionsModel.IOptions
?
Как я сказал изначально, вам нужно передать этот экземпляр типа или сконфигурированный контейнер, это бесполезно, просто регистрируя сам тип, поскольку он должен быть сконструирован фабрикой GetService.
Эй, теперь я понял, что ты сказал, это сработало! Я отправил IApplicationBuilder
в пользовательский загрузчик и оттуда зарегистрировал IOptions<AppSettings>
со значением, возвращенным из ApplicationServices.GetService()
.
Я не уверен, что это лучшее решение, поскольку TinyIoc будет действовать как шлюз между моей службой и Microsoft.Extensions.DependencyInjection
.
@RTodorov Возможно, уместно создать библиотеку загрузчика Nancy, которая использует Microsoft.Extensions.DependencyInjection
в качестве контейнера вместо TinyIoC, это уже сделано для многих различных контейнеров.
Самый полезный комментарий
@RTodorov Возможно, уместно создать библиотеку загрузчика Nancy, которая использует
Microsoft.Extensions.DependencyInjection
в качестве контейнера вместо TinyIoC, это уже сделано для многих различных контейнеров.