Nancy: Nancy / TinyIocでIOptionsパターンを使用できません

作成日 2016年01月25日  ·  6コメント  ·  ソース: NancyFx/Nancy

NancyFX / TinyIOCを使用するプロジェクトにオプションパターン(ここで推奨されているように:https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects)を実装しようとしていますが、そうではありません働く。

Startup.cs / ConfigureServicesメソッドにオプションを登録していますが、クラスに設定を挿入しようとすると、TinyIocがNancy.TinyIoc.TinyIoCResolutionExceptionをスローします:タイプを解決できません:AppSettings。

これは、オプションパターンがMicrosoft.Extensions.DependencyInjectionを使用しているのに、ナンシーがデフォルトとしてTinyIocを使用しているため、TinyIocがIOptionsを解決しようとして失敗したためだと思います。

TinyIocでIOptions <>を使用する方法はありますか?

最悪の場合、MS DependencyInjectionの代わりにTinyIocを使用できますか?

これが私のコードです:

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、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

どうもありがとうございます。

最も参考になるコメント

@RTodorov TinyIoCの代わりMicrosoft.Extensions.DependencyInjectionをコンテナとして使用するNancyブートストラッパーライブラリを作成するのが適切な場合があります。これはすでに多くの異なるコンテナに対して行われています。

全てのコメント6件

IOptionsを登録していませんナンシーのコンテナのどこかにあるので、それは機能しません。その魔法の「services.Configure」が何であるかわかりません。(Configuration.GetSection( "AppSettings")); "は内部で実行されていますが、次のいずれかの方法でそのタイプをナンシーのコンテナーに登録する必要があります。

  • 独自のブートストラッパーを作成し、IOptionsを渡しますナンシーの使用を構成しているブートストラッパーを使用してそのctorに入れ、次にブートストラッパーでそれをConfigureApplicationContainerに登録します。
  • 共有したいタイプが他にもある場合は、上記と同じようにしますが、タイプを渡す代わりに、新しく構成されたTinyIocContainerを渡し、派生したブートストラッパーでGetApplicationContainerのインスタンスを返します。

それが理にかなっていることを願っています。

私はこれを行うことによって登録しようとしました:

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

ところで、 Microsoft.Extensions.DependencyInjection内部でservices.AddOptions();が行うことはどれですか

これはどういう意味ですか?

services.Configure()は、ロードされた構成を取得し、誰かがAppSettingsを必要とする場合に備えてMSDIに登録します。

これをカスタムブートストラップに追加しました:

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

これでエラーは発生しなくなりましたが、残念ながらオブジェクトは空で作成されます。

デバッグ時に、これにより正しいデータが入力されたオブジェクトが返されることに気付きました。

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

しかし、これは空のオブジェクトを返します:

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

それでも、IOptionsをリクエストすると、TinyIocがMs FrameworkDIの代わりになります。。 また、すべてのMicrosoft。* dllがTinyIocの無視リストに含まれていることにも気付きました。 Microsoft.Extensions.OptionsModel.IOptionsを要求したときに「返信」するべきではないということですか?

最初に言ったように、その型インスタンスまたは構成済みコンテナーを渡す必要があります。GetServiceファクトリによって構築される必要があるため、型自体を登録するだけではダメです。

ねえ、今私はあなたが言ったことを理解しました、それはうまくいきました! IApplicationBuilderをカスタムブートストラップに送信し、そこからApplicationServices.GetService()から返された値でIOptions<AppSettings>を登録しました。

TinyIocは私のサービスとMicrosoft.Extensions.DependencyInjection間のゲートウェイとして機能するため、これが最善の解決策かどうかはわかりません。

@RTodorov TinyIoCの代わりMicrosoft.Extensions.DependencyInjectionをコンテナとして使用するNancyブートストラッパーライブラリを作成するのが適切な場合があります。これはすでに多くの異なるコンテナに対して行われています。

このページは役に立ちましたか?
0 / 5 - 0 評価