2012-07-21 9 views
13

मैं लेआउट का उपयोग करने वाले प्रत्येक दृश्य में ऐसा करने से बचने के लिए साझा लेआउट व्यू पेज में निर्भरता लगाने की कोशिश कर रहा हूं।ऑटोफैक लेआउट व्यू फ़ाइलों में निर्भरता इंजेक्ट कर सकता है?

मैंने विचारों में निर्भरता इंजेक्शन लगाने के लिए विकी में guidance का पालन किया है, लेकिन संपत्ति हमेशा शून्य है।

क्या ऑटोफैक एक कस्टम व्यू पेज में गुणों को इंजेक्ट कर सकता है जो लेआउट फ़ाइल है?

मेरा सेटअप यहां है। CustomViewPage

namespace MyApp 
{ 
    using System.Web.Mvc; 

    public abstract class CustomViewPage : WebViewPage 
    { 
     public IHelper Helper { get; set; } 
    } 
} 

~/दृश्य/साझा/_Layout.cshtml

@inherits MyApp.CustomViewPage 
<!DOCTYPE html> 
<html> 
... 
@if(this.Helper.HasFoo()){@Html.ActionLink("Bar")} 

वैश्विक पंजीकरण ...

builder.RegisterType<Helper>().AsImplementedInterfaces(); 
builder.RegisterModelBinderProvider(); 
builder.RegisterFilterProvider(); 
builder.RegisterModule(new AutofacWebTypesModule()); 
builder.RegisterSource(new ViewRegistrationSource()); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

"बच्चा" विचारों कि लेआउट का उपयोग से प्राप्त नहीं है कस्टमव्यूपेज।

+3

ऐसा लगता है कि यह ऑटोफैक का एक [ज्ञात मुद्दा] (http://code.google.com/p/autofac/issues/detail?id=349) है ... – nemesv

+0

हाँ समस्या यहां http: // कोड है .google.com/p/autofac/issues/detail? id = 349 – GraemeMiller

+1

यह उत्तर मेरे लिए कामकाज के रूप में काम करता है: http://stackoverflow.com/a/14935006/789683 – flipchart

उत्तर

1

यह केवल ऑटोफ़ैक के साथ ही नहीं है, आप लेआउट में DI प्राप्त नहीं कर सकते हैं। निर्भरताओं को हल करने के लिए आपको CustomViewPage में आईओसी कंटेनर के संदर्भ की आवश्यकता हो सकती है।

जब तक यह वास्तव में आवश्यक नहीं है केवल विचारों में DI से बचें (केवल मेरी राय)।

मेरे दृष्टिकोण से मुझे बहुत लाभ नहीं दिखते हैं। मुझे लगता है कि आप बेस व्यू पेज क्लास के लिए यूनिट टेस्ट लिखने वाले नहीं हैं? जब तक कोई विशेष कारण न हो तो इससे बचें। कंटेनर के साथ निर्भरता रखने के बजाय ठोस कार्यान्वयन के साथ निर्भरता होना बेहतर है।

+3

किसी भी प्रकार का संदर्भ या पृष्ठभूमि क्यों आप कर सकते हैं लेआउट में डी नहीं? – Josh

+0

@ जोश ऊपर बताए अनुसार, यह मेरी राय है और कई अन्य, मैंने कभी नहीं कहा कि आप यह नहीं कर सकते कि शायद यह सबसे अच्छा विचार नहीं है ... कुछ कारणों से क्यों नहीं, यूनिट परीक्षण करना मुश्किल होगा, जो आईओसी लाइब्रेरी आप के साथ जाती है उसे कंटेनर को हल करने के लिए एचटीपी कॉनटेक्स्ट तक पहुंच की आवश्यकता होगी और आप शायद उस स्थिति में समाप्त हो जाएंगे जहां आपका विचार सीधे सेवा के लिए बात कर रहा है इसलिए एमवीसी पैटर्न को तोड़ना। यह सब कुछ है कि वे चीजें कैसे करते हैं और मैं यह नहीं कह रहा हूं कि आप यह नहीं कर सकते कि आप डिज़ाइन को फिर से सोचना चाहें और सुनिश्चित करें कि कोई बेहतर विकल्प नहीं है –

+0

@Joe_DM क्या आप अपना संपादन एक नए उत्तर के रूप में पोस्ट कर सकते हैं ? – VJAI

0

यहां एक छोटा सा काम है जो अधिकांश डी ढांचे के साथ काम करेगा।

सबसे पहले आप एक छोटा सा CustomPageView समायोजित:

public abstract class CustomViewPage : WebViewPage 
{ 
    public IHelper Helper { 
     get { return ViewData[Helper.ViewDataKey] as IHelper; }  
    } 

} 

अब अच्छी तरह से यह करने के लिए एक विशेषता पेश करते हैं, अपने ViewData में dependancy प्राप्त करने की आवश्यकता: आप कार्रवाई विधि या नियंत्रक पर

public sealed class HelperAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var viewResult = filterContext.Result as ViewResult; 
     if (viewResult != null) 
      viewResult.ViewData.Add(Helper.ViewDataKey, GetHelperFromIoC()); 

     base.OnResultExecuting(filterContext); 
    } 
} 

:

[Helper] 
public ActionResult Index() 
{ 
    return View(); 
} 

और आपके विचार में अब आप अपने सहायक को एक्सपेक के रूप में उपयोग करने में सक्षम होना चाहिए टेड:

@Helper.HelloWorld() 

मूल पोस्ट के लिए this blog देखें।

15

समाधान के अधिकांश DependencyResolver.Current.GetService कॉल चारों ओर सिर्फ एक आवरण हो जाएगा, तो यह लेआउट से सीधे कॉल करने के लिए आसान हो सकता है:

@{ 
    var helper = DependencyResolver.Current.GetService<IHelper>(); 
} 
... 
@if (helper.HasFoo()) { @Html.ActionLink("Bar") } 
... 

इसके अलावा इस तरह से पेज मॉडल अधिक SRP बनाने के लिए मदद करता है, क्योंकि मिश्रण सेवा दिनचर्या/मॉडल और व्यापारियों से बच सकते हैं।

0

परिणामस्वरूप कोई पैरामीटर नहीं है, आपको डेटा को पास करने के लिए अपने वेबव्यूपेज को बढ़ाने की आवश्यकता नहीं है। मैं इसे इस तरह हल कर दूंगा: 1. एक्शनफ़िल्टर से व्युत्पन्न एक वर्ग हेल्परएक्शनफिल्टर घोषित करें, http://docs.autofac.org/en/latest/integration/mvc.html के माध्यम से अपनी सेवा इंजेक्ट करें 2. हेल्परएक्शनफिल्टर.ऑनएक्शन सेटअप के अंदर सेटअप ViewBag.HasFoo इसे लेआउट में जांचें।

0

बस आंशिक पेज बना सकते हैं और लेआउट पेज में डालने:

@Html.Partial("_MyPartialPage"); 

निर्भरता आंशिक पृष्ठ में इंजेक्ट किया जाता है।

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