与TinyIOC / NancyFX无关的IOptions

时间:2016-01-25 11:03:11

标签: c# asp.net asp.net-core nancy tinyioc

我正在尝试在NancyFX / TinyIOC的项目上实施选项模式(建议使用here),但它不起作用。

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

  

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

我认为这是因为选项模式使用Microsoft.Extensions.DependencyInjectionNancy使用TinyIoc作为默认值,因此TinyIoc会尝试解析IOptions<AppSettings>并失败。

有没有办法将IOptions<>TinyIoc一起使用?

这是我的代码:

Startup.cs

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

MyService.cs

public SearchService(IOptions<AppSettings> config)
{
}

错误:

  

应用程序启动异常:   System.Reflection.TargetInvocationException:抛出了异常   通过调用的目标。

     

System.InvalidOperationException:   尝试满足其中一个依赖项时出错了   在撰写过程中,请确保您已注册所有新内容   容器中的依赖关系并检查innerexception以获取更多信息   细节。

     

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

非常感谢。

1 个答案:

答案 0 :(得分:3)

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

Startup.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>>());
    }