سؤال

ربما مشكلة بسيطة، ولكن غريبة لماذا ليس لدي أي فكرة عن كيفية القيام بذلك:

الوحدة (PRISM) والأساليب الثابتة.في هذه الحالة الخاصة، طريقة التمديد.ولكن بشكل عام، كيف يمكنني الوصول إلى "مثيل الوحدة المقدمة" بطريقة ثابتة.فكر على سبيل المثال.من خدمة التسجيل التي أرغب في الوصول إليها لتسجيل بعض الأشياء التي أقوم بها داخل طريقة ثابتة.هل يجب علي حقًا تمرير المرجع إلى خدمة التسجيل عند استخدامه؟

مثال (قريب من المشكلة الفعلية)

public static void HookupPrismEvent(ref UIElement, ILogger log) {...}

يبدو الأمر غريبًا، أعتقد أنني أفتقد بعض الأشياء، مثل Container.Resolve (العزم الثابت).لم يتم العثور على أي شيء، لكن الحاوية أو الوحدة أو الثابت ليست أفضل مصطلحات البحث في العالم.ربما يجب أن أحاول ذلك فحسب، لكن مع ذلك، يبدو الأمر "غريبًا" نوعًا ما.

إذن هل هناك أي تعليقات حول كيفية استخدام DI بطرق ثابتة؟

كريس

تعديل - حسنًا، النهج الحالي بعد الإجابة:EDIT2، بعد التفكير في الأمر، أزال الحاوية، وقدم "ما هو مطلوب"....

  public static void AttachPrismEvents(this UIElement element, IEventAggregator eA)
    {
        var ev = eA.GetEvent<KeyPressedEvent>();
        element.KeyDown += ((sender, e) => ev.Publish(e));
    }

أو مع التسجيل:

  public static void AttachPrismEvents(this UIElement element, ILogger log, IEventAggregator eA)
    {
        log.Debug("Doing stuff");
        var ev = eA.GetEvent<KeyPressedEvent>();
        element.KeyDown += ((sender, e) => ev.Publish(e));
    }
هل كانت مفيدة؟

المحلول

الأنواع والأعضاء الثابتة هي بشكل عام عدو لكل ما يتعلق بـ DI.

من الناحية الفنية، يمكن أن يكون لديك طريقة حل ثابتة، ولكن هذا لن يكون DI، بل نمطًا يُعرف باسم محدد موقع الخدمة.ومع ذلك، فإن العديد من الأشخاص (وأنا منهم) يعتبرون محدد موقع الخدمة بمثابة نمط مضاد لعدة أسباب:

  • فهو يقدم افتراضات ضمنية حول متطلبات استخدام واجهة برمجة التطبيقات (لا يتم إعلام المتصل بأنه يجب تكوين محدد موقع الخدمة بشكل صحيح قبل استدعاء العضو)
  • يصبح من المستحيل عش الحاويات
  • فهو يقدم تبعية زائدة عن الحاجة إلى محدد موقع الخدمة نفسه

إذا كان يجب أن يكون لديك طريقة ثابتة، فيجب عليك تمرير التبعية عبر طريقة الحقن، لكنني أعتقد أنه غالبًا ما يكون من المفيد إعادة النظر في التصميم العام لواجهة برمجة التطبيقات.في كثير من الأحيان، يمكن تصميم الوظيفة المطلوبة كعضو على أحد معلمات الإدخال بدلاً من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top