2011-10-16 17 views
11

के लिए संपत्ति इंजेक्शन मैं अपने BaseController कक्षा से प्राप्त किसी भी नियंत्रक पर स्वचालित रूप से एक संपत्ति सेट करने का प्रयास कर रहा हूं। मेरे Application_Start विधि में कोड यहां दिया गया है। जब मैं कोशिश करता हूं और एक्सेस करता हूं तो UnitOfWork संपत्ति हमेशा शून्य होती है।बेस कंट्रोलर क्लास

var builder = new ContainerBuilder(); 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterType<VesteraTechnologiesContext>().As<IContext>(); 
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>(); 
builder.RegisterType<BaseController>() 
     .OnActivated(c => c.Instance.UnitOfWork = c.Context.Resolve<IUnitOfWork>()); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

यहाँ BaseController

public class BaseController : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

कारण मैं एक संपत्ति के माध्यम से के बजाय पर एक निर्माता के माध्यम से ऐसा करने के लिए कोशिश कर रहा हूँ कैसा दिखता तो है कि मैं निर्माता नकल करने की जरूरत नहीं है है प्रत्येक नियंत्रक में UnitOfWork संपत्ति तक पहुंच की आवश्यकता है, क्योंकि कन्स्ट्रक्टर विरासत में नहीं हैं।

उत्तर

14

डिफ़ॉल्ट रूप से Autofac नियंत्रकों पंजीकृत करता है निर्माता इंजेक्शन का उपयोग करें। property injection with autofac को सक्षम करने के लिए: आपको उपयोग करना चाहिए:

builder.RegisterControllers(typeof(MvcApplication).Assembly) 
     .PropertiesAutowired(); 
+0

धन्यवाद nemesv, यह पूरी तरह से काम किया। टिप के लिए –

+0

@nemesv धन्यवाद। क्या आप जानते हैं कि अगर इसका कोई प्रभाव पड़ता है? – tugberk

+0

@tugberk मैंने प्रोडक्ट्स का उपयोग नहीं किया है उत्पादन उत्पादन में उपयोग किया गया है, इसलिए मुझे नहीं पता कि इसका कितना प्रभाव पड़ता है। यह सार्वजनिक सेटटेबल गुणों को खोजने के लिए प्रतिबिंब का उपयोग करता है, इसलिए कम से कम सामान्य प्रतिबिंब लागत होती है। – nemesv

-1

क्योंकि कन्स्ट्रक्टर विरासत में नहीं हैं।

आमतौर पर, यह इस प्रकार आधार निर्माता कॉल करने के लिए संभव है:

public DescendantClass() 
    : base() 
{ 
} 
+0

ओपी को 'IUnitOfWork' पैरामीटर के साथ एक कन्स्ट्रक्टर की आवश्यकता होगी। –

+0

GertArnold सही है, और मुझे पता है कि मैं रचनाकारों को कैस्केड कर सकता हूं, लेकिन यही वह है जिसे मैं टालने की कोशिश कर रहा हूं। धन्यवाद। –

+0

इस तरह का एक सार्वजनिक कन्स्ट्रक्टर गैर-डिफॉल्ट कन्स्ट्रक्टर वाले ऑब्जेक्ट के लिए "डिफ़ॉल्ट कन्स्ट्रक्टर" प्रदान करने के लिए कुछ भी नहीं करता है। बेस कन्स्ट्रक्टर को स्वचालित रूप से निहित "डिफ़ॉल्ट कन्स्ट्रक्टर" द्वारा बुलाया जाएगा। – user2246674

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