Nancy: غير قادر على استخدام نمط IOptions مع Nancy / TinyIoc

تم إنشاؤها على ٢٥ يناير ٢٠١٦  ·  6تعليقات  ·  مصدر: NancyFx/Nancy

أحاول تنفيذ نمط الخيارات (على النحو الموصى به هنا: 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

شكرا جزيلا.

التعليق الأكثر فائدة

RTodorov قد يكون من المناسب إنشاء مكتبة Nancy bootstrapper التي تستخدم Microsoft.Extensions.DependencyInjection كحاوية بدلاً من TinyIoC ، ويتم ذلك للعديد من الحاويات المختلفة بالفعل.

ال 6 كومينتر

أنت لا تسجل IOptionsفي حاوية نانسي في أي مكان حتى لا تعمل ، لست متأكدًا من هذه الخدمات السحرية(Configuration.GetSection ("AppSettings"))؛ "تعمل تحت الغطاء ، ولكن ستحتاج إلى تسجيل هذا النوع في حاوية نانسي إما عن طريق:

  • إنشاء أداة التشغيل الخاصة بك ، وتمرير IOptionsفي مُنشئه ، باستخدام أداة التمهيد حيث تقوم بتكوين استخدام Nancy ، ثم في bootstrapper سجل ذلك في ConfigureApplicationContainer
  • إذا كان هناك المزيد من الأنواع التي تريد مشاركتها ، فافعل الشيء نفسه كما هو مذكور أعلاه ، ولكن بدلاً من تمرير الأنواع ، قم بتمرير TinyIocContainer الذي تم تكوينه حديثًا ثم أعد هذا المثيل لـ GetApplicationContainer في bootstrapper المشتق.

اتمنى ان يكون هذا منطقي

حاولت التسجيل من خلال القيام بذلك:

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 عندما أطلب IOptions. أدركت أيضًا أن جميع ملفات Microsoft. * dll موجودة في قائمة TinyIoc's Ignore ، فهل هذا يعني أنه لا يجب "الرد" عندما أطلب Microsoft.Extensions.OptionsModel.IOptions ؟

كما قلت في الأصل ، تحتاج إلى تمرير هذا النوع من النوع في ، أو حاوية تم تكوينها ، فليس من الجيد مجرد تسجيل النوع نفسه لأنه يحتاج إلى أن يتم إنشاؤه بواسطة مصنع GetService.

مرحبًا ، فهمت الآن ما قلته ، لقد نجح الأمر! لقد أرسلت IApplicationBuilder إلى التمهيد المخصص ومن هناك سجلت IOptions<AppSettings> بالقيمة التي تم إرجاعها من ApplicationServices.GetService() .

لست متأكدًا من أن هذا هو الحل الأفضل ، لأن TinyIoc سيعمل كبوابة بين خدمتي و Microsoft.Extensions.DependencyInjection .

RTodorov قد يكون من المناسب إنشاء مكتبة Nancy bootstrapper التي تستخدم Microsoft.Extensions.DependencyInjection كحاوية بدلاً من TinyIoC ، ويتم ذلك للعديد من الحاويات المختلفة بالفعل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

jchannon picture jchannon  ·  9تعليقات

thecodejunkie picture thecodejunkie  ·  8تعليقات

Radzhab picture Radzhab  ·  11تعليقات

destagia picture destagia  ·  5تعليقات

lgabryel picture lgabryel  ·  7تعليقات