7

हम वर्तमान में एनएचबीरनेट और एएसपी.नेट एमवीसी और एसक्यूएल सर्वर बैकएंड के आधार पर एक एप्लीकेशन विकसित कर रहे हैं। चूंकि मैं एनएचबीर्नेट के लिए काफी नया हूं, इसलिए मैं सर्वोत्तम प्रथाओं को समझने की कोशिश कर रहा हूं।nHibernate, एएसपी.नेट एमवीसी, एस # आर्क आर्किटेक्चर और कई समान डेटाबेस

हमारे आवेदन के लिए प्रत्येक उपयोगकर्ता को अपना स्वयं का SQL सर्वर डेटाबेस होना आवश्यक है। इन डेटाबेसों में सभी की एक समान संरचना है।

हमारे ग्राहकों को ग्राहक कोड के साथ पहचाना जाता है, उदा। 1500

हम nHibernate के लिए एक कस्टम कनेक्शन प्रदाता है, जो हम पहले से ही हमारे nServiceBus बैकएंड सेवाओं में उपयोग के साथ आ गया है:

public class DynamicConnectionProvider : DriverConnectionProvider 
{ 
    public override IDbConnection GetConnection() 
    { 
     IDbConnection conn = Driver.CreateConnection(); 

     try 
     { 
      var messageExecutionContext = ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext; 
      if (messageExecutionContext.CustomerId == 0) 
      { 
       conn.ConnectionString = ConfigurationManager.ConnectionStrings["dev"] 
        .ConnectionString; 
      } 
      else 
      { 
       conn.ConnectionString = ConfigurationManager.ConnectionStrings["default"] 
        .ConnectionString 
        .FormatWith(messageExecutionContext.CustomerId); 
      } 

      conn.Open(); 
     } 
     catch (Exception) 
     { 
      conn.Dispose(); 
      throw; 
     } 
     return conn; 
    } 
} 

यह कनेक्शन प्रदाता एक संदर्भ वस्तु में ग्राहक कोड की जाँच करता है और सेट तदनुसार कनेक्शनस्ट्रिंग।

हम एक HttpContext जागरूक ITTTContextProvider प्रदान करने की योजना बना रहे हैं। इस के लिए मैं दो प्रश्न हैं:

  1. हम कैसे यूआरएल से ग्राहक कोड को पुनः प्राप्त करने के लिए और हमारे संदर्भ वस्तु में यह हर अनुरोध के लिए रख सकते हैं? जब हम निम्नलिखित मार्ग का उपयोग करते हैं?

    <main-site-url>/{customercode}/{controller}/{action}/{id}

  2. कई समान डेटाबेस से कनेक्ट होने की इस पद्धति मान्य है या यह एक sessionfactory foreach ग्राहक डेटाबेस के निर्माण के लिए बेहतर अभ्यास है?

उत्तर

1

आदेश प्राप्त करने के लिए customercode आपके द्वारा दी गई ऊपर टुकड़ा में इस कोड नहीं डाल करने के लिए हो सकता है, मार्ग डेटा का उपयोग करने की जरूरत है

HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current); //ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext; 
RouteData routeData = RouteTable.Routes.GetRouteData(currentContext); 
var cusomterCode = routeData.Values["customercode"] 

मेरी दूसरी सुझाव की तर्ज पर कुछ। इसे दूर सार। Joshua's answer देखें जो उस दृष्टिकोण को हाइलाइट करता है जिसके बारे में मैं सोच रहा हूं।

वास्तव में दूसरे प्रश्न पर मदद नहीं कर सकता, वास्तव में वर्णित दोनों ढांचे से परिचित नहीं है।

+1

मूल रूप से इस सवाल का जवाब में - मैं एक बनाने सत्र कारखाने क्या याद से एक महंगी आपरेशन जो शायद कुछ है कि अपने निर्णय में कारक होगा है। अब यह भी मानते हैं कि कई डेटाबेस हैं, और प्रति डेटाबेस की हिट की अपेक्षित राशि पर भी निर्भर करते हैं, यह एक महत्वपूर्ण कारक हो सकता है। सत्र कारखानों में कैशिंग आदि जैसे लाभ नहीं हैं जो आपकी स्थिति में उपयोगी हो सकते हैं? यह मदद की जा सकती है - http://www.codeproject.com/KB/aspnet/NHibernateMultipleDBs.aspx – Ahmad

+0

कैशिंग कुछ ऐसा है जो हम भविष्य में लागू करने की आवश्यकता होगी। हालांकि, द्वितीय स्तर कैशिंग कैसे कार्यान्वित किया जाता है? प्रति सत्र फैक्टरी या प्रति कनेक्शन (स्ट्रिंग)? – Rik

+0

@Rik - क्षमा करें, जैसा कि मैंने कहा था कि मैं बहुत परिचित नहीं हूं और ढांचे के साथ अनुभव पर पर्याप्त हाथ नहीं है – Ahmad

1

मेरा हालिया ब्लॉग पोस्ट देखें जो विभिन्न डेटाबेस से कनेक्ट करने के लिए सबडोमेन का उपयोग कैसे करें, हालांकि यह आपके आईटीएनएन्ट कॉन्टेक्स्ट के अपने संस्करण को कार्यान्वित करना आसान होगा जो अनुरोध यूआरएल से ग्राहक कोड को पकड़ लेगा। प्रत्येक किरायेदार के लिए अलग-अलग सत्र कारखानों का भी उपयोग करता है।

http://www.yellowfeather.co.uk/2011/01/multi-tenancy-on-sharp-architecture/

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