/ / Unity.MVC पैरामीटर के साथ मेरे नियंत्रक ctor को हल नहीं कर सकता - c #, .net, निर्भरता-इंजेक्शन, asp.net-web-api2, एकता-कंटेनर

Unity.MVC पैरामीटर के साथ मेरे नियंत्रक ctor को हल नहीं कर सकता - c #, .net, निर्भरता-इंजेक्शन, asp.net-web-api2, एकता-कंटेनर

मेरे पास एक एएसपी.एमवीसी 4 साइट है जिसमें एक वेब एपीआई 2 नियंत्रक भी है। मैं DI के लिए यूनिटी.एमवीसी का उपयोग कर रहा हूं। जब मैं जावास्क्रिप्ट से एपीआई को कॉल करता हूं तो यह कहता है कि यह नियंत्रक का उदाहरण नहीं बना सकता है। यदि मैं एक डिफ़ॉल्ट ctor बना देता हूं तो यह उदाहरण बनाता है लेकिन निश्चित रूप से निर्भरता शून्य है, लेकिन कम से कम मुझे पता है कि हिस्सा काम कर रहा है।

यहां मेरा एपीआई सीटीओआर है:

public class ContactController : ApiController
{
IContactService service;

// dependency injection is being done here by Unity. look in UnityConfig where we register IContactSevice to ContactService. Whenever asp.net see"s IContactService it now knows to make a new ContactService instance
// we do this for 2 reasons: 1) this makes unit testing possible where we can mock the IContactService and 2) this makes maintaining the code easier where we can change the contact service class we want to use later and we wouldn"t have to change the code here in this controller
public ContactController(IContactService _service)
{
service = _service;
}

यहां UnityConfig.cs के अंदर है (जब यह मुझे NuGet से मिला तो मेरे लिए ऑटो जेनरेट किया गया था और मैंने निर्भरताओं को भर दिया)। जब मैं ऐप शुरू करता हूं तो इसे कॉल किया जाता है।

public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IContactService, ContactService>();
}

मैं क्या खो रहा हूँ?

उत्तर:

जवाब के लिए 3 № 1

वेबएपीआई नियंत्रकों के पास एक अलग यूनिटी पंजीकरण है। चूंकि आप पहले से ही उपयोग कर रहे हैं Unity.MVC पैकेज आप जोड़ सकते हैं Unity.AspNet.WebApi bootstrapper।

चूंकि कॉन्फ़िगरेशन स्वचालित रूप से प्रतिस्थापित हो जाता है, इसलिए मैं सामग्री की बचत करूंगा UnityConfig.cs दूसरे पैकेज को आयात करने से पहले मैन्युअल रूप से दो गठबंधन करें। लेकिन असली अंतर अलग-अलग हैं एकता * Activator.cs फ़ाइलें।