أحاول تنفيذ نمط الخيارات (على النحو الموصى به هنا: https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects) على مشروع مع NancyFX / TinyIOC ولكنه ليس كذلك عمل.
أقوم بتسجيل الخيارات في طريقة Startup.cs / ConfigureServices ولكن عندما أحاول حقن الإعدادات في صفي ، فإن TinyIoc يرمي Nancy.TinyIoc.TinyIoCResolutionException: غير قادر على حل النوع: AppSettings.
أعتقد أن هذا لأن نمط الخيارات يستخدم Microsoft.Extensions.DependencyInjection لكن نانسي تستخدم TinyIoc كإعداد افتراضي لذلك يحاول TinyIoc حل IOptions ويفشل.
هل هناك طريقة لاستخدام IOptions <> مع TinyIoc؟
أسوأ حالة ، هل يمكنني استبدال TinyIoc بـ MS DependencyInjection؟
هذا هو الكود الخاص بي:
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 ، الإصدار = 1.0.0.0 ، الثقافة = محايد ، 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<>));
ما راجع للشغل هو ما يفعله services.AddOptions();
تحت الغطاء مقابل Microsoft.Extensions.DependencyInjection
هل هذا ما تقصده؟
services.Configure () سيأخذ التكوين المحمّل ويسجل في MS DI عندما يطلب شخص ما إعدادات التطبيقات.
أضفت هذا إلى التمهيد المخصص:
container.Register<IOptions<ElasticSearchConfig>, OptionsManager<ElasticSearchConfig>>();
والآن لم يعد الخطأ يحدث بعد الآن ولكن للأسف تم إنشاء الكائن فارغًا.
عند تصحيح الأخطاء ، أدركت أن هذا سيعيد الكائن المأهول الصحيح:
`var appSettings = app.ApplicationServices.GetService
لكن هذا سيعيد كائنًا فارغًا:
var appSettings = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve<IOptions<AppSettings>>();
ومع ذلك ، تحل TinyIoc محل السيدة Framework DI عندما أطلب IOptionsMicrosoft.Extensions.OptionsModel.IOptions
؟
كما قلت في الأصل ، تحتاج إلى تمرير هذا النوع من النوع في ، أو حاوية تم تكوينها ، فليس من الجيد مجرد تسجيل النوع نفسه لأنه يحتاج إلى أن يتم إنشاؤه بواسطة مصنع GetService.
مرحبًا ، فهمت الآن ما قلته ، لقد نجح الأمر! لقد أرسلت IApplicationBuilder
إلى التمهيد المخصص ومن هناك سجلت IOptions<AppSettings>
بالقيمة التي تم إرجاعها من ApplicationServices.GetService()
.
لست متأكدًا من أن هذا هو الحل الأفضل ، لأن TinyIoc سيعمل كبوابة بين خدمتي و Microsoft.Extensions.DependencyInjection
.
RTodorov قد يكون من المناسب إنشاء مكتبة Nancy bootstrapper التي تستخدم Microsoft.Extensions.DependencyInjection
كحاوية بدلاً من TinyIoC ، ويتم ذلك للعديد من الحاويات المختلفة بالفعل.
التعليق الأكثر فائدة
RTodorov قد يكون من المناسب إنشاء مكتبة Nancy bootstrapper التي تستخدم
Microsoft.Extensions.DependencyInjection
كحاوية بدلاً من TinyIoC ، ويتم ذلك للعديد من الحاويات المختلفة بالفعل.