यदि आप नहीं जानते कि मैं किस बारे में बात कर रहा हूं तो the tutorial पर जाएं और निर्भरता को इंजेक्शन जोड़ने का प्रयास करें या समस्या के बारे में मेरी व्याख्या के साथ अपनी किस्मत आजमाएं।क्या ASP.NET MVC संपर्क प्रबंधक ट्यूटोरियल में निर्भरता इंजेक्शन लूप समस्या को हल करने का कोई अच्छा/उचित तरीका है?
नोट: यह समस्या ASP.NET पर मूल ट्यूटोरियल के दायरे में नहीं है। ट्यूटोरियल केवल सुझाव देता है कि इस्तेमाल किए गए पैटर्न निर्भरता इंजेक्शन अनुकूल हैं।
समस्या मूल रूप से नियंत्रक, मॉडलस्टेटवापर और ContactManagerService के बीच एक निर्भरता पाश है।
- संपर्क नियंत्रक कन्स्ट्रक्टर एक आईकॉन्टैक्ट प्रबंधक सेवा लेता है।
- ContactManagerService निर्माता एक IContactManagerRepository (महत्वपूर्ण नहीं) और एक IValidationDictionary (जो ModelStateWrapper औजार) लेता है।
- मॉडलस्टेटवापर कन्स्ट्रक्टर मॉडलस्टेट डिक्शनरी (जो नियंत्रक पर "मॉडलस्टेट" नामक एक संपत्ति है) लेता है।
तो निर्भरता चक्र की तरह इस चला जाता है: नियंत्रक> सेवा> ModelStateWrapper> नियंत्रक
आप इस के लिए निर्भरता इंजेक्शन जोड़ने का प्रयास करते हैं, तो यह असफल हो जायेगी। तो मेरा सवाल है; मुझे इसके बारे में क्या करना चाहते हैं? अन्य ने इस सवाल को पोस्ट किया है, लेकिन उत्तर कम, अलग हैं, और सभी थोड़े "हैक-आश" लगते हैं। इस संरचना के साथ
public class ContactController : Controller
{
private readonly IContactService _contactService;
public ContactController(IContactService contactService)
{
_contactService = contactService;
contactService.Initialize(new ModelStateWrapper(ModelState));
}
//Class implementation...
}
public class ContactService : IContactService
{
private IValidationDictionary _validationDictionary;
private readonly IContactRepository _contactRepository;
public ContactService(IContactRepository contactRepository)
{
_contactRepository = contactRepository;
}
private void Initialize(IValidationDictionary validationDictionary)
{
if(validationDictionary == null)
throw new ArgumentNullException("validationDictionary");
_validationDictionary = validationDictionary;
}
//Class implementation...
}
public class ModelStateWrapper : IValidationDictionary
{
private readonly ModelStateDictionary _modelState;
public ModelStateWrapper(ModelStateDictionary modelState)
{
_modelState = modelState;
}
//Class implementation...
}
मैं इस तरह मेरी एकता कंटेनर कॉन्फ़िगर कर सकते हैं:
public static void ConfigureUnityContainer()
{
IUnityContainer container = new UnityContainer();
// Registrations
container.RegisterTypeInHttpRequestLifetime<IContactRepository, EntityContactRepository>();
container.RegisterTypeInHttpRequestLifetime<IContactService, ContactService>();
ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
}
मेरे वर्तमान समाधान IModelStateWrapper इस तरह के बजाय IService निर्माता से दूर करने के लिए और जोड़ने के लिए कोई Initialize विधि है
दुर्भाग्य से इसका मतलब है कि सेवा पर "आरंभ करें" विधि को नियंत्रक कन्स्ट्रक्टर द्वारा मैन्युअल रूप से कहा जाना चाहिए। क्या कोई बेहतर तरीका है? हो सकता है कि जहां मैं किसी भी तरह से अपनी एकता विन्यास में IValidationDictionary शामिल हो? क्या मुझे एक और डी कंटेनर पर स्विच करना चाहिए? क्या मैं कुछ भूल रहा हूँ?
मैं स्वीकार करने के लिए मैं इस ट्यूटोरियल 3 बार किया है और कभी भी इस पार नहीं आए हैं है? क्या स्रोत में समस्या या मैन्युअल रूप से ट्यूटोरियल का पालन करना है, यदि यह बाद वाला है तो संभवतः एक चरण गुम हो रहा है? – BinaryMisfit
प्रश्न मूल ट्यूटोरियल के दायरे से बाहर चला गया है जो केवल निर्भरता इंजेक्शन पर संकेत देता है लेकिन यह दिखाने के लिए कभी नहीं आया कि यह कैसे किया जाना चाहिए। मैं इस सवाल को स्पष्ट करूंगा। – JohannesH