2010-12-15 12 views
5

मैं अपने डब्ल्यूसीएफ प्रोजेक्ट के लिए एनएचबीनेटनेट स्टार्टअप मॉड्यूल का उपयोग करना चाहता हूं जैसे कि मैं अपने एएसपी.नेट एमवीसी परियोजनाओं के लिए उपयोग करता हूं। जेफ़री पालेर्मो स्टार्टअप मॉड्यूल की रूपरेखा तैयार करता है जिसे मैं अपने पोस्ट ASP.NET MVC HttpModule Registration में उपयोग करता हूं। मूलतः कोड web.config कि इस तरह दिखता है में एक स्टार्टअप मॉड्यूल जोड़ने के लिए नीचे फोड़े:डब्ल्यूसीएफ प्रोजेक्ट में एनएचबीर्नेट को स्टार्टअप करने का आसान तरीका

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="StartupModule" type="Infrastructure.NHibernateModule, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </modules> 
    </system.webServer> 

यह काम नहीं कर रहा है जब मैं WCF Test Client या सीधे SoapUI साथ endpoint के खिलाफ के साथ सेवा को चलाने के लिए प्रयास करें। डब्ल्यूसीएफ परियोजना में एनएचबीर्नेट के लिए एक सरल स्टार्टअप तंत्र के लिए मेरे विकल्प क्या हैं?

उत्तर

6

के लिए ISessionFactory प्रबंधन देख सकते हैं आप एक Message Inspector का उपयोग करके समस्या को हल कर सकते हैं। आपके NHibernateModule पर IDispatchMessageInspector लागू करें। यह आपको अपने एनएचबीर्नेट सत्र को खोलने की अनुमति देगा क्योंकि प्रत्येक अनुरोध प्राप्त होता है और आपके उत्तर भेजने से ठीक पहले इसे बंद कर देता है।

पालेर्मो का डेमो इंगित करता है कि आपने IHttpModule बढ़ाया होगा। अगर ऐसा है, तो आप IDispatchMessageInspector इंटरफेस के लिए दो तरीकों जोड़ देगा:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
{ 
    context_BeginRequest(null, null); 
    return null; 
} 

और

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    context_EndRequest(null, null); 
} 

यह अपने पुराने कोड का उपयोग कर नए इंटरफ़ेस को लागू करेगा। आपको IServiceBehavior इंटरफ़ेस को भी लागू करने की आवश्यकता होगी। यह आपको अपने web.config में व्यवहार एक्सटेंशन पर मॉड्यूल का उपयोग करने की अनुमति देगा।

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
{ 
    foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher ed in cd.Endpoints) 
     { 
      ed.DispatchRuntime.MessageInspectors.Add(this); 
     } 
    } 
} 

यह अंतिम बिंदुओं में से प्रत्येक के लिए अपने नए निरीक्षक जोड़ देगा: IServiceBehavior तीन तरीकों की आवश्यकता है, केवल एक ही वास्तव में कुछ भी करेंगे।

आपको फिर BehaviorExtensionElement जोड़ना होगा। यह व्यवहार एक्सटेंशन एक्सटेंशन को आपके NHibernateModule के प्रकार और एक नए उदाहरण को वापस करना चाहिए। यह आपको एक नया व्यवहार बनाने की अनुमति देगा जो आपके web.config में NHibernateModule देता है।

public class NHibernateWcfBehaviorExtension : BehaviorExtensionElement 
{ 
    public override Type BehaviorType 
    { 
     get { return typeof(NHibernateModule); } 
    } 

    protected override object CreateBehavior() 
    { 
     return new NHibernateModule(); 
    } 
} 

अब आपके पास सभी टुकड़े हैं, आप उन्हें अपने web.config में उपयोग कर सकते हैं। उन्हें सभी सेवाओं पर लागू करने के लिए आपके web.config को निम्न जैसा दिखना चाहिए।

<system.serviceModel> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true"/> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
     <NHibernateSessionStarter /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <extensions> 
    <behaviorExtensions> 
     <add name="NHibernateSessionStarter" type="Infrastructure.NHibernateWcfBehaviorExtension, Infrastructure, Version=1.0.0.0, Culture=neutral" /> 
    </behaviorExtensions> 
    </extensions> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 
संबंधित मुद्दे