मैं वर्तमान में एक एन-टियर समाधान डिजाइन कर रहा हूं जो एंटिटी फ्रेमवर्क 5 (.net 4) का उपयोग अपनी डेटा एक्सेस रणनीति के रूप में कर रहा है, लेकिन यह परीक्षण योग्य / लचीला बनाने के लिए निर्भरता इंजेक्शन को शामिल करने के तरीके के बारे में चिंतित है।
मेरा वर्तमान समाधान लेआउट निम्नानुसार है (मेरे समाधान को अलकाट्राज़ कहा जाता है):
Alcatraz.WebUI : एक asp.net वेबफॉर्म प्रोजेक्ट, फ्रंट एंड यूजर इंटरफेस, प्रोजेक्ट्स Alcatraz.Business और Alcatraz.Data.Models ।
Alcatraz.Business : एक क्लास लाइब्रेरी प्रोजेक्ट, जिसमें व्यावसायिक तर्क होते हैं, संदर्भ प्रोजेक्ट Alcatraz.Data.Access , Alcatraz.Data.Models
Alcatraz.Data.Access : एक वर्ग पुस्तकालय परियोजना, मकान AlcatrazModel.edmx और AlcatrazEntities
DbContext, संदर्भ परियोजना Alcatraz.Data.Models ।
Alcatraz.Data.Models : एक क्लास लाइब्रेरी प्रोजेक्ट में, Alcatraz मॉडल के लिए POCO शामिल हैं, कोई संदर्भ नहीं।
यह समाधान कैसे काम करेगा, इसके लिए मेरी दृष्टि वेब-यूआई व्यापार पुस्तकालय के भीतर एक भंडार को तुरंत रोक देगी, इस भंडार में कनेक्शन स्ट्रिंग (कोई AlcatrazEntities
उदाहरण नहीं) की निर्भरता (निर्माणकर्ता के माध्यम से ) होगी। वेब-यूआई डेटाबेस कनेक्शन स्ट्रिंग्स को जानता होगा, लेकिन ऐसा नहीं है कि यह एक इकाई फ्रेमवर्क कनेक्शन स्ट्रिंग था।
व्यवसाय परियोजना में:
public class InmateRepository : IInmateRepository
{
private string _connectionString;
public InmateRepository(string connectionString)
{
if (connectionString == null)
{
throw new ArgumentNullException("connectionString");
}
EntityConnectionStringBuilder connectionBuilder = new EntityConnectionStringBuilder();
connectionBuilder.Metadata = "res://*/AlcatrazModel.csdl|res://*/AlcatrazModel.ssdl|res://*/AlcatrazModel.msl";
connectionBuilder.Provider = "System.Data.SqlClient";
connectionBuilder.ProviderConnectionString = connectionString;
_connectionString = connectionBuilder.ToString();
}
public IQueryable<Inmate> GetAllInmates()
{
AlcatrazEntities ents = new AlcatrazEntities(_connectionString);
return ents.Inmates;
}
}
वेब UI में:
IInmateRepository inmateRepo = new InmateRepository(@"data source=MATTHEW-PC\SQLEXPRESS;initial catalog=Alcatraz;integrated security=True;");
List<Inmate> deathRowInmates = inmateRepo.GetAllInmates().Where(i => i.OnDeathRow).ToList();
इस डिजाइन के बारे में मेरे कुछ संबंधित प्रश्न हैं।
क्या यह डिज़ाइन एंटिटी फ्रेमवर्क क्षमताओं के संदर्भ में भी समझ में आता है? मैंने सुना है कि इकाई ढांचा पहले से ही यूनिट-ऑफ-वर्क के पैटर्न का उपयोग करता है, क्या मैं सिर्फ अमूर्त की एक और परत जोड़ रहा हूं?
मैं नहीं चाहता कि मेरा वेब-यूआई सीधे एंटिटी फ्रेमवर्क के साथ संवाद करे (या उस मामले के लिए भी इसे संदर्भित करें), मैं चाहता हूं कि सभी डेटाबेस तक व्यावसायिक परत के माध्यम से जाया जाए क्योंकि भविष्य में मेरे पास एक ही व्यवसाय परत का उपयोग करके कई परियोजनाएं होंगी (वेब सेवा, विंडोज़ अनुप्रयोग, आदि) और मैं एक केंद्रीय क्षेत्र में व्यावसायिक तर्क रखने के द्वारा इसे बनाए रखना / अपडेट करना आसान बनाना चाहता हूं। क्या यह इसे प्राप्त करने का एक उचित तरीका है?
क्या व्यावसायिक परत में भी रिपॉजिटरी होनी चाहिए, या जो एक्सेस लेयर के भीतर होनी चाहिए? यदि वे कहाँ ठीक हैं, तो क्या कनेक्शन स्ट्रिंग एक अच्छी निर्भरता मान रहा है?
पढ़ने के लिए समय निकालने के लिए धन्यवाद!
DbContext
इसकी निर्भरता के रूप में स्वीकार करता है । व्यापारिक वर्गों के पास एक निर्भरता के रूप में भंडार हैं। निर्भरता इंजेक्शन के लिए, मैं इसे मैन्युअल रूप से कर रहा हूं (इसलिए मैं समझता हूं कि क्या चल रहा है)। जिस कारण से मैं कनेक्शन स्ट्रिंग को सेट करने में सक्षम होना चाहता हूं,DbContext
क्या मैं डेटाबेस का उपयोग कर रहा हूं ताकि कुछ मामलों में मुझे अलग-अलग डेटाबेस (एक ही संरचना) से जुड़ने के लिए इकाई ढांचे की आवश्यकता हो। क्या मैं आपको ठीक से समझ पा रहा हूं?