2009-06-17 19 views
9

मेरा प्रश्न इस प्रकार है: मेरे पास बेस नियंत्रक (एएसपी.नेट एमवीसी नियंत्रक) है जिसे एप्लिकेशन कंट्रोलर कहा जाता है, और मैं चाहता हूं कि मेरे सभी नियंत्रक इसे प्राप्त करें। इस बेस कंट्रोलर में एक इलोगर संपत्ति है, जो एक [निर्भरता] विशेषता के साथ चिह्नित है। (हाँ, मुझे पता है कि मुझे कन्स्ट्रक्टर इंजेक्शन का उपयोग करना चाहिए, मैं इस विशेषता के बारे में उत्सुक हूं)।एकता [निर्भरता] इंजेक्शन और विरासत

मैं कंटेनर, पंजीकृत प्रकार बनाया, डिफ़ॉल्ट कारखाना बदल गया है, सब कुछ ठीक है। समस्या यह है कि जब मैं व्युत्पन्न नियंत्रक में अपनी लॉगर संपत्ति का उपयोग करने का प्रयास करता हूं, तो यह हल नहीं होता है।

क्या मैं गलत कर रहा हूँ? व्युत्पन्न नियंत्रक बनाते समय कंटेनर बेस क्लास निर्भरताओं को क्यों हल नहीं करता है?

कोड नमूने:


ApplicationController:

public class ApplicationController : Controller 
{ 
    [Dependency] 
    protected ILogger _logger { get; set; } 

} 

व्युत्पन्न नियंत्रक:

public class HomeController : ApplicationController 
{ 
    public HomeController() 
    { 

    } 
    public ActionResult Index() 
    { 
     _logger.Log("Home controller constructor started."); 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

एकता नियंत्रक कारखाना:

public class UnityControllerFactory : DefaultControllerFactory 
{ 
    private readonly IUnityContainer _container; 
    public UnityControllerFactory(IUnityContainer container) 
    { 
     _container = container; 
    } 

    protected override IController GetControllerInstance(Type controllerType) 
    { 
     return _container.Resolve(controllerType) as IController; 
    } 
} 

Global.asax.cs नमूना:


मैं एकता के लिए काफी नया हूँ, इसलिए शायद मैंने कुछ गलत नहीं किया।

धन्यवाद, अमी।

+0

क्या यह एप्लिकेशन नियंत्रक के लिए काम करता है? –

+0

क्या आपको यह कभी काम करने के लिए मिला? मेरा कोड लगभग समान है और मुझे या तो हल करने के लिए आधार नियंत्रक नहीं मिल सकता है। कोई? –

+0

रे - यह संपत्तियों को सार्वजनिक बनाने के बाद काम किया। यूनिटी काम करने के लिए आपको वह कीमत चुकानी पड़ेगी। – Ami

उत्तर

18

AFAIK, एकता केवल सार्वजनिक गुणों को हल करेगी। इसलिए आपकी संरक्षित संपत्ति का समाधान नहीं किया जाएगा।

+0

ठीक है, जैकोब को 2 अंक मिलते हैं :) सार्वजनिक रूप से संपत्ति को बदलने के लिए समस्या को हल किया गया। एकता कंटेनर निर्भरता का समाधान किया और सब ठीक है। – Ami

0

मुझे यकीन नहीं है कि यह संबंधित है, लेकिन आम तौर पर, मैं उसी नाम से नामस्थान और कक्षाएं रखने से बचता हूं (आपके मामले में, लॉगर.लोगर), क्योंकि मुझे अतीत में समस्याएं थीं। लेकिन यह समस्या नहीं हो सकती है।

मैं भी अगर [निर्भरता] विशेषता व्युत्पन्न प्रकार के लिए काम करता है यकीन नहीं है। यदि आप इसे कन्स्ट्रक्टर इंजेक्शन के लिए बदलते हैं, तो क्या यह अभी भी काम नहीं करता है? की तरह कुछ:

public class ApplicationController : Controller 
{ 
    protected ILogger _logger { get; set; } 


    public ApplicationController(ILogger logger) 
    { 
     this._logger = logger; 

    } 
} 

और

public class HomeController : ApplicationController 
{ 
    public HomeController(ILogger logger) : base(logger) 
    { 

    } 
    public ActionResult Index() 
    { 
     _logger.Log("Home controller constructor started."); 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

और बाकी सिर्फ एक ही। कोड ठीक दिखता है।

0

मैं एकता के साथ काफी अनुभवहीन हूं, लेकिन मुझे लगता है कि आपको अपने होमकंट्रोलर को कन्टरनर के साथ पंजीकृत करने की आवश्यकता है, न कि लॉगर।

+1

लॉगर को पंजीकृत करना सही है क्योंकि आप अपनी निर्भरता (एक इलोगर कार्यान्वयन) इंजेक्ट करना चाहते हैं। –

0

मेरे पास एक ही समस्या थी, और इसे आईएलओगर को सार्वजनिक रूप से बदलकर तय किया गया। यह VS2010, .NET 4 में एएसपी.नेट एमवीसी 2 प्रोजेक्ट के साथ है। यह समझ में आता है, तर्कसंगत रूप से, क्योंकि एकता प्रॉक्सी क्लास या कुछ भी नहीं बना रही है, यह सिर्फ उन गुणों को सेट कर रही है जिनके पास इसका उपयोग है, और इसके लिए मैपिंग है - इसलिए केवल सार्वजनिक।

संबंधित मुद्दे