Nancy: Tidak dapat menggunakan pola IOptions dengan Nancy/TinyIoc

Dibuat pada 25 Jan 2016  ·  6Komentar  ·  Sumber: NancyFx/Nancy

Saya mencoba menerapkan Pola Opsi (seperti yang direkomendasikan di sini: https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects) pada proyek dengan NancyFX / TinyIOC tetapi tidak bekerja.

Saya mendaftarkan Opsi pada metode Startup.cs/ConfigureServices tetapi ketika saya mencoba menyuntikkan pengaturan di kelas saya, TinyIoc melempar Nancy.TinyIoc.TinyIoCResolutionException: Tidak dapat menyelesaikan jenis: AppSettings.

Saya pikir ini karena Pola Opsi menggunakan Microsoft.Extensions.DependencyInjection tetapi Nancy menggunakan TinyIoc sebagai default sehingga TinyIoc mencoba menyelesaikan IOptions dan gagal.

Apakah ada cara untuk menggunakan IOptions<> dengan TinyIoc?

Kasus terburuk, dapatkah saya mengganti TinyIoc untuk MS DependencyInjection?

Berikut kode saya:

Startup.cs:

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

Layanan Saya.cs:

public SearchService(IOptions<AppSettings> config)
{
}

Kesalahan:

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, Versi=1.0.0.0, Culture=netral, PublicKeyToken=null]]``

Beberapa info tambahan:

"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"
},

Versi runtime DNX:

1.0.0-rc1-update1 mono

Terima kasih banyak.

Komentar yang paling membantu

@RTodorov Mungkin tepat untuk membuat pustaka bootstrap Nancy yang menggunakan Microsoft.Extensions.DependencyInjection sebagai wadah menggantikan TinyIoC, ini sudah dilakukan untuk banyak wadah berbeda.

Semua 6 komentar

Anda tidak mendaftar IOptionske dalam wadah Nancy di mana saja sehingga tidak akan berfungsi, saya tidak yakin apa itu "services.Configure(Configuration.GetSection("AppSettings"));" dilakukan di bawah tenda, tetapi Anda harus mendaftarkan jenis itu ke dalam wadah Nancy dengan:

  • Membuat bootstrap Anda sendiri, melewati IOptionske ctor-nya, menggunakan bootstrap tempat Anda mengonfigurasi penggunaan Nancy, lalu di bootstrap daftarkan itu di ConfigureApplicationContainer
  • Jika ada lebih banyak jenis yang ingin Anda bagikan, lakukan hal yang sama seperti di atas, tetapi alih-alih meneruskan jenisnya, berikan TinyIocContainer yang baru dikonfigurasi dan kemudian kembalikan instance itu untuk GetApplicationContainer di bootstrap turunan Anda.

Harapan itu masuk akal.

Saya mencoba mendaftar dengan melakukan ini:

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

Yang BTW adalah apa yang dilakukan services.AddOptions(); bawah tenda untuk Microsoft.Extensions.DependencyInjection

Apakah ini yang Anda maksud?

services.Configure() akan mengambil konfigurasi yang dimuat dan mendaftar di MS DI ketika seseorang membutuhkan AppSettings.

Saya menambahkan ini pada bootstrap khusus:

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

dan sekarang error tersebut tidak terjadi lagi tapi sayang objek yang dibuat kosong.

Saat men-debug, saya menyadari bahwa ini akan mengembalikan objek yang diisi dengan benar:

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

Tapi ini akan mengembalikan objek kosong:

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

Tetap saja, TinyIoc menggantikan Ms Framework DI ketika saya meminta IOptions. Saya juga menyadari bahwa semua Microsoft.* dll ada di daftar Abaikan TinyIoc, apakah itu berarti seharusnya tidak "membalas" ketika saya meminta Microsoft.Extensions.OptionsModel.IOptions ?

Seperti yang saya katakan sebelumnya, Anda harus memasukkan instance tipe itu, atau wadah yang dikonfigurasi, tidak ada gunanya hanya mendaftarkan tipe itu sendiri karena perlu dibangun oleh pabrik GetService.

Hei, sekarang saya mengerti apa yang Anda katakan, itu berhasil! Saya mengirim IApplicationBuilder ke bootstrap khusus dan dari sana mendaftarkan IOptions<AppSettings> dengan nilai yang dikembalikan dari ApplicationServices.GetService() .

Saya tidak yakin ini adalah solusi terbaik, karena TinyIoc akan bertindak sebagai gerbang antara layanan saya dan Microsoft.Extensions.DependencyInjection .

@RTodorov Mungkin tepat untuk membuat pustaka bootstrap Nancy yang menggunakan Microsoft.Extensions.DependencyInjection sebagai wadah menggantikan TinyIoC, ini sudah dilakukan untuk banyak wadah berbeda.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat