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
どうもありがとうございます。
IOptionsを登録していません
それが理にかなっていることを願っています。
私はこれを行うことによって登録しようとしました:
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.Extensions.OptionsModel.IOptions
を要求したときに「返信」するべきではないということですか?
最初に言ったように、その型インスタンスまたは構成済みコンテナーを渡す必要があります。GetServiceファクトリによって構築される必要があるため、型自体を登録するだけではダメです。
ねえ、今私はあなたが言ったことを理解しました、それはうまくいきました! IApplicationBuilder
をカスタムブートストラップに送信し、そこからApplicationServices.GetService()
から返された値でIOptions<AppSettings>
を登録しました。
TinyIocは私のサービスとMicrosoft.Extensions.DependencyInjection
間のゲートウェイとして機能するため、これが最善の解決策かどうかはわかりません。
@RTodorov TinyIoCの代わりにMicrosoft.Extensions.DependencyInjection
をコンテナとして使用するNancyブートストラッパーライブラリを作成するのが適切な場合があります。これはすでに多くの異なるコンテナに対して行われています。
最も参考になるコメント
@RTodorov TinyIoCの代わりに
Microsoft.Extensions.DependencyInjection
をコンテナとして使用するNancyブートストラッパーライブラリを作成するのが適切な場合があります。これはすでに多くの異なるコンテナに対して行われています。