बेस क्लास कन्स्ट्रक्टर को कॉल करना स्पष्ट रूप से सी # में कन्स्ट्रक्टर इंजेक्शन का उपयोग करने का एकमात्र तरीका है। ऐसा लगता है कि आपको BaseController
और PublicController
से पैरामीटर रहित कन्स्ट्रक्टर को हटा देना चाहिए क्योंकि लॉगर उपलब्ध होने पर उन्हें वास्तव में कभी नहीं कहा जाना चाहिए।
आधार नियंत्रक में निर्भरता इंजेक्शन की समस्या एएसपी.नेट एमवीसी और आईओसी का उपयोग कर एक आम है। विचार के कई विकल्प/स्कूल हैं।
1.) कुल सेवाओं का उपयोग करें। व्युत्पन्न वर्ग कन्स्ट्रक्टर को सरल रखने के लिए, बेस कंट्रोलर (उदा। IBaseControllerDependencies
या इसी तरह की सभी आवश्यक सेवाओं को प्रदर्शित करने वाली सभी अलग-अलग सेवाओं को प्रदर्शित या प्रतिनिधि करने वाली एक सेवा बनाएं।) फिर ILogger
के साथ इस सेवा को BaseController
पर पास करें।
आपके आवेदन और आपके द्वारा उपयोग किए जा रहे बेस क्लास की संख्या के आधार पर विभिन्न पेशेवर/विपक्ष हैं।इस पर और अधिक देखने के लिए Google 'ऑटोफैक कुल सेवाओं' के लिए।
2.) संपत्ति इंजेक्शन का उपयोग करें। अपने आधार वर्ग सार्वजनिक पर ILogger
संपत्ति है, और का उपयोग कर कंटेनर कॉन्फ़िगर करें:
builder.RegisterControllers().PropertiesAutowired();
संपत्ति इंजेक्शन वास्तव में Autofac में एक पसंदीदा तकनीक नहीं है। निर्भरता स्वीकार करने के लिए कन्स्ट्रक्टर की भूमिका है, जबकि लिखने योग्य गुणों को अक्सर कोड गंध के रूप में देखा जाता है, इसलिए ऑटोफ़ैक वास्तव में इस मामले के लिए अनुकूलित नहीं होता है। दोषों में से एक यह है कि लिखने योग्य गुण इंजेक्शन नहीं होना चाहिए, अक्सर अजीब परिणामों के साथ गलती से होते हैं।
3.) विभिन्न एक्शन फ़िल्टर में रिएक्टर आधार नियंत्रक कार्यक्षमता। ऑटोफैक एमवीसी एक्शन इनवोकेशन पाइपलाइन में एक्शन फ़िल्टर इंजेक्ट कर सकता है। इस प्रकार फ़िल्टर बेस क्लास पर निर्भरताएं ले सकते हैं, और एक ही चिंता को क्रॉस-कटिंग तरीके में लागू किया जा सकता है। वेब पर इस बारे में अधिक जानकारी, ExtensibleActionInvoker
और .InjectActionInvoker()
आपको जिस जानकारी की आवश्यकता होगी उसे इंगित करें। सभी चिंताओं के साथ हमेशा संभव नहीं है।
4, आपके दूसरे प्रश्न का उत्तर भी।) DependencyResolver.Current
से सेवा स्थान का उपयोग कर आधार नियंत्रक निर्भरताओं को हल करें।
var logger = DependencyResolver.Current.GetService<ILogger>();
कारण यह प्रोत्साहित नहीं किया गया है कि यह जिसके परिणामस्वरूप आवेदन कठिन बना देता है समझने के लिए, क्योंकि यह अब संभव नहीं है देखने के लिए क्या एक घटक सेवाएँ एक ही स्थान पर देख कर पर निर्भर करता है है (निर्माता।) निर्धारित करने के लिए किसी विशेष घटक का उपयोग करने से पहले कंटेनर में कॉन्फ़िगर किया जाना चाहिए, GetService()
कॉल खोजने के लिए किसी को घटक के पूरे कोडबेस को देखना होगा। यूनिट परीक्षण करते समय एक उल्लेखनीय बाधा।
उम्मीद है कि यह मदद करता है, मस्तिष्क डंप का थोड़ा सा मुझे पता है :) अन्य शायद इनके लिए कुछ और विचार जोड़ सकते हैं।