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.
Anda tidak mendaftar IOptions
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 IOptionsMicrosoft.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.
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.