मैं निम्नलिखित ADO नेट भंडारIDisposable
public class Repository : IRepository, IDisposable
{
private readonly IUnitOfWork UnitOfWork;
private SqlConnection Connection;
public Repository(IUnitOfWork unitOfWork, connectionString)
{
UnitOfWork = unitOfWork;
Connection = new SqlConnection(connectionString);
Connection.Open();
}
public MyObject FindBy(string userName)
{
//...Ado .Net command.ExecuteReader, etc.
}
}
यह भंडार एक डोमेन सेवा के लिए एक आईओसी कंटेनर के साथ इंजेक्ट किया जाता है और इतने की तरह इस्तेमाल किया जाता है:
public class UserDomainService : IUserDomainService
{
private readonly IRepository Repository;
public UserDomainService(IRepository repository)
{
Repository = repository;
}
public User CreateNewUser(User user)
{
using(Repository)
{
var user = Repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!");
Repository.Add(user);
Repository.Commit();
}
}
}
विचार यह है कि मैं हमेशा रिपोजिटरी ऑब्जेक्ट को एक उपयोग कथन में डालता हूं, जब यह खत्म हो जाता है, कनेक्शन बंद हो जाता है और इसका निपटारा किया जाता है लेकिन मैं इसे एक समस्या के रूप में देखता हूं क्योंकि डोमेन सेवा वर्ग अभी भी जिंदा है और यदि इसमें दूसरी कॉल है, तो विफल हो जाएगा क्योंकि भंडार पहले ही नष्ट हो चुका है।
अब मैं सभी कोड का पूरा नियंत्रण है और मैं केवल मोटे अनाज सेवा कॉल डिजाइन करने के लिए चाहते हैं, लेकिन वहाँ पूरी बात है कि सही महसूस नहीं करता है के बारे में कुछ है।
मैं इसे इस तरह कर रहा हूँ तो मैं बच सकते हैं कि डोमेन सेवा भंडार में OpenConnection और CloseConnection तरीकों के बारे में जानता है।
इस डिजाइन स्वाभाविक बुरा है या ऐसा करने का एक बेहतर तरीका है?
सोचा के बाद: सभी निर्भरता पेड़ WCF स्तर पर बनाई जा रही है जब एक अनुरोध आता है और, बेशक आप देख सकते हैं कि कनेक्शन उस पल में खोला जाता है, क्योंकि यह भंडार के निर्माता में होता है तो मुझे विश्वास है कि यह बुरा नहीं है क्योंकि यह केवल इस विशेष कॉल की अवधि के लिए खुला है। क्या मैं इस धारणा पर सही हूं या क्या मैं प्रक्रिया में जल्दी ही डीबी कनेक्शन खोलकर बहुत बुरा कर रहा हूं?
'आईआरपीपॉजिटरी 'निकटता से' रिपोजिटरी 'के साथ मिलकर है? मतलब, क्या इसमें इसके तरीके शामिल हैं, जैसे 'Find'? यदि हां, तो क्या यह इंटरफ़ेस 'IDISposable' का संकेत देता है? –
मेरे पास मेरा स्वयं का प्रश्न है जो इससे संबंधित हो सकता है: [सर्विसकॉन्टेनर, आईओसी, और डिस्पोजेबल ऑब्जेक्ट्स] (http://stackoverflow.com/questions/556580/servicecontainer-ioc-and-disposable-objects)। –
आपको 'रिपोजिटरी' में 'SqlConnection' क्यों चाहिए? आपके 'IUnitOfWork' के लिए कुछ और लगता है। – Steven