न तो पृष्ठ वर्ग है और न ही प्रस्तुतकर्ताओं निर्माण या उसके निर्भरता से किसी के जीवन चक्र के प्रबंधन के साथ सीधे निपटने के लिए होना चाहिए। चूंकि कन्स्ट्रक्टर इंजेक्शन वेबफॉर्म के साथ काम नहीं करता है, इसलिए आपको कक्षा में गुणों के रूप में किसी भी आवश्यक निर्भरता का पर्दाफाश करना होगा। उदाहरण के लिए, आप करने के लिए अपने वर्ग को बदल सकता है:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public _DefaultPresenter Presenter { get; set; }
}
पेज, भंडार के लिए किसी भी संदर्भ की जरूरत नहीं चाहिए क्योंकि यह प्रस्तोता में इंजेक्ट कर दिया जाएगा।
इस उत्तर के बाकी StructureMap के लिए विशिष्ट है - विवरण अन्य कंटेनरों के लिए अलग हो सकता है।
सेटर इंजेक्शन सक्षम करने के लिए, आप StructureMap बताने के लिए जो गुण को पॉप्युलेट करने की जरूरत है। एक तरीका यह है कि संपत्ति में [SetterProperty] विशेषता लागू करें। हालांकि, यह आपके वर्गों में स्ट्रक्चर मैप विवरण रखने के लिए थोड़ा आक्रामक महसूस कर सकता है। एक और तरीका स्ट्रक्चर मैप को कॉन्फ़िगर करना है ताकि यह जान सके कि कौन सी संपत्ति प्रकार इंजेक्ट करना है। उदाहरण के लिए:
protected void Application_Start(object sender, EventArgs e)
{
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.ForRequestedType<IRepository>().TheDefaultIsConcreteType<Repository>().CacheBy(InstanceScope.Hybrid);
x.SetAllProperties(set => set.WithAnyTypeFromNamespaceContainingType<IRepository>());
});
}
SetAllProperties विधि आपको स्ट्रक्चर मैप को यह बताने की अनुमति देता है कि इसे किस संपत्ति को पॉप्युलेट करना चाहिए। इस मामले में, मैं सभी प्रस्तुतियों को इंजेक्ट करने के लिए स्ट्रक्चर मैप कह रहा हूं (मान लीजिए कि वे सभी एक ही नामस्थान में हैं)।
आपको अभी भी प्रत्येक अनुरोध पर सेटटर इंजेक्शन करने की आवश्यकता है।स्ट्रक्चर मैप के साथ, आप मौजूदा उदाहरण में निर्भरताओं को इंजेक्ट करने के लिए BuildUp() विधि का उपयोग करते हैं। आप इसे प्रत्येक पृष्ठ या पृष्ठ बेस क्लास की इनिट या लोड घटनाओं में कर सकते हैं, लेकिन फिर, यह आक्रामक लगता है। पूरी तरह से अपने पेज कक्षाओं से बाहर कंटेनर रखने के लिए, आप PreRequestHandlerExecute आवेदन की (Global.asax में या एक IHttpModule) घटना का उपयोग कर सकते हैं:, अंत में
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
var application = (HttpApplication)sender;
var page = application.Context.CurrentHandler as Page;
if (page == null) return;
ObjectFactory.BuildUp(page);
}
अगर आप चाहते हैं करने के लिए स्पष्ट रूप से अपने IRepository का निपटान, आप कि संभाल सकता EndRequest स्थिति में:
protected void Application_EndRequest(object sender, EventArgs e)
{
var disposable = ObjectFactory.GetInstance<IRepository>() as IDisposable;
if (disposable != null) disposable.Dispose();
}
ध्यान दें कि यह ठीक से काम करता है क्योंकि प्रारंभ में हम हाइब्रिड, जिसका अर्थ है द्वारा IRepository कैश करने के लिए StructureMap को बताया, "मुझे प्रत्येक HTTP अनुरोध के लिए एक ही उदाहरण (या धागा देते हैं, अगर एक वेबसाइट के भीतर नहीं चल रहा है) "। जब आप EndRequest में IRepository पुनर्प्राप्त करते हैं, तो आप अनुरोध के दौरान उपयोग किए गए वही प्राप्त करेंगे, और आप इसका निपटान कर सकते हैं।
अपने प्रश्न में कोड या टैग को देखने के लिए खेद है! अब इसे फिर से काम किया है - आशा है कि मामलों में सुधार होगा! यदि आप अपना हटा देते हैं तो इसे हटा देंगे ... –