हम वर्तमान में एनएचबीरनेट और एएसपी.नेट एमवीसी और एसक्यूएल सर्वर बैकएंड के आधार पर एक एप्लीकेशन विकसित कर रहे हैं। चूंकि मैं एनएचबीर्नेट के लिए काफी नया हूं, इसलिए मैं सर्वोत्तम प्रथाओं को समझने की कोशिश कर रहा हूं।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
प्रदान करने की योजना बना रहे हैं। इस के लिए मैं दो प्रश्न हैं:
हम कैसे यूआरएल से ग्राहक कोड को पुनः प्राप्त करने के लिए और हमारे संदर्भ वस्तु में यह हर अनुरोध के लिए रख सकते हैं? जब हम निम्नलिखित मार्ग का उपयोग करते हैं?
<main-site-url>/{customercode}/{controller}/{action}/{id}
कई समान डेटाबेस से कनेक्ट होने की इस पद्धति मान्य है या यह एक sessionfactory foreach ग्राहक डेटाबेस के निर्माण के लिए बेहतर अभ्यास है?
मूल रूप से इस सवाल का जवाब में - मैं एक बनाने सत्र कारखाने क्या याद से एक महंगी आपरेशन जो शायद कुछ है कि अपने निर्णय में कारक होगा है। अब यह भी मानते हैं कि कई डेटाबेस हैं, और प्रति डेटाबेस की हिट की अपेक्षित राशि पर भी निर्भर करते हैं, यह एक महत्वपूर्ण कारक हो सकता है। सत्र कारखानों में कैशिंग आदि जैसे लाभ नहीं हैं जो आपकी स्थिति में उपयोगी हो सकते हैं? यह मदद की जा सकती है - http://www.codeproject.com/KB/aspnet/NHibernateMultipleDBs.aspx – Ahmad
कैशिंग कुछ ऐसा है जो हम भविष्य में लागू करने की आवश्यकता होगी। हालांकि, द्वितीय स्तर कैशिंग कैसे कार्यान्वित किया जाता है? प्रति सत्र फैक्टरी या प्रति कनेक्शन (स्ट्रिंग)? – Rik
@Rik - क्षमा करें, जैसा कि मैंने कहा था कि मैं बहुत परिचित नहीं हूं और ढांचे के साथ अनुभव पर पर्याप्त हाथ नहीं है – Ahmad