चूंकि यह डेटा एक्सेस लेयर में डेटा ऑब्जेक्ट है, इसलिए इसे सीधे डेटाबेस सेवा पर निर्भर होना चाहिए। आप कंस्ट्रक्टर के लिए एक डेटाबेस सेवा निर्दिष्ट कर सकते हैं:
DataObject dataObject = new DataObject(new DatabaseService());
dataObject.Update();
लेकिन, इंजेक्शन को कंस्ट्रक्टर में नहीं होना चाहिए। वैकल्पिक रूप से, आप प्रत्येक CRUD विधि के माध्यम से निर्भरता प्रदान कर सकते हैं। मैं इस विधि को पिछले पसंद करता हूं क्योंकि आपके डेटा ऑब्जेक्ट को यह जानने की आवश्यकता नहीं है कि यह तब तक बनी रहेगी जब तक कि आपको वास्तव में इसे बनाए रखने की आवश्यकता न हो।
DataObject dataObject = new DataObject();
dataObject.Update(new DatabaseService());
आप निश्चित रूप से निर्माण को सीआरयूडी विधियों में छिपाना नहीं चाहते हैं!
public void Update()
{
// DON'T DO THIS!
using (DatabaseService dbService = new DatabaseService())
{
...
}
}
एक वैकल्पिक विकल्प यह होगा कि डेटाबेससेवा का निर्माण एक उच्च श्रेणी के माध्यम से किया जाए।
public void Update()
{
// GetDatabaseService() is protected virtual, so in unit testing
// you can subclass the Data Object and return your own
// MockDatabaseService.
using (DatabaseService dbService = GetDatabaseService())
{
...
}
}
एक अंतिम विकल्प एक सिंगलटन-स्टाइल सर्विसलोकेटर का उपयोग करना है। हालांकि मैं इस विकल्प को नापसंद करता हूं, यह इकाई परीक्षण योग्य है।
public void Update()
{
// The ServiceLocator would not be a real singleton. It would have a setter
// property so that unit tests can swap it out with a mock implementation
// for unit tests.
using (DatabaseService dbService = ServiceLocator.GetDatabaseService())
{
...
}
}