1

我正在尝试在带有 / 的项目上实施选项模式(如此推荐),NancyFXTinyIOC它不起作用。

我正在Startup.cs.ConfigureServices方法上注册选项,但是当我尝试在我的类中注入设置时TinyIoc会抛出:

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:AppSettings。

我认为这是因为选项模式使用Microsoft.Extensions.DependencyInjection但默认Nancy使用TinyIoc,因此TinyIoc尝试解决IOptions<AppSettings>并失败。

有没有办法使用IOptions<>with TinyIoc

这是我的代码:

启动.cs

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

我的服务.cs

public SearchService(IOptions<AppSettings> config)
{
}

错误:

应用程序启动异常:System.Reflection.TargetInvocationException:调用目标已引发异常。

System.InvalidOperationException:在组合过程中尝试满足其中一个依赖项时出现问题,请确保您已在容器中注册了所有新依赖项并检查内部异常以获取更多详细信息。

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:Nancy.NancyEngine

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:Nancy.Routing.DefaultRequestDispatcher

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:Nancy.Routing.DefaultRouteResolver

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:Nancy.Routing.RouteCache

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:MyProject.MyService

Nancy.TinyIoc.TinyIoCResolutionException:无法解析类型:Microsoft.Extensions.OptionsModel.IOptions`1[[MyProject.AppSettings, MyProject, Version=1.0.0.0, Culture=neutral, 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

非常感谢。

4

1 回答 1

3

其实我找到了答案。我必须创建一个自定义引导程序并在 TinyIoc 上注册已解决的依赖项:

启动.cs:

    public void Configure(IApplicationBuilder app)
    {
        app.UseOwin(x => x.UseNancy(new NancyOptions
        {
            Bootstrapper = new CustomBootstrapper(app)
        }));
    }

CustomBootstrapper.cs:

    protected override void ConfigureApplicationContainer(TinyIoCContainer container)
    {
        base.ConfigureApplicationContainer(container);

        container.Register<IOptions<AppSettings>>(_app.ApplicationServices.GetService<IOptions<AppSettings>>());
    }
于 2016-01-26T15:02:03.637 回答