रिपोजिटरी और कार्य की इकाई के बीच संबंध


17

मैं एक रिपॉजिटरी लागू करने जा रहा हूं, और मैं UOW पैटर्न का उपयोग करना चाहूंगा क्योंकि रिपॉजिटरी का उपभोक्ता कई ऑपरेशन कर सकता है, और मैं उन्हें एक ही बार में कमिट करना चाहता हूं।

मामले के बारे में कई लेखों को पढ़ने के बाद, मुझे अभी भी यह नहीं पता है कि इस दो तत्वों को कैसे संबंधित किया जाए, लेख के आधार पर यह एक तरह से यू में किया जा रहा है।

कभी-कभी UOW रिपॉजिटरी के लिए कुछ आंतरिक होता है:

public class Repository
{
    UnitOfWork _uow;

    public Repository()
    {
       _uow = IoC.Get<UnitOfWork>();
    }

    public void Save(Entity e)
    {
        _uow.Track(e);
    }

    public void SubmittChanges()
    {
        SaveInStorage(_uow.GetChanges());
    }
}

और कभी-कभी यह बाहरी होता है:

public class Repository
{
    public void Save(Entity e, UnitOfWork uow)
    {
        uow.Track(e);
    }

    public void SubmittChanges(UnitOfWork uow)
    {
        SaveInStorage(uow.GetChanges());
    }
}

अन्य समय, UOW है जिसे रिपॉजिटरी का संदर्भ दिया जाता है

public class UnitOfWork
{
    Repository _repository;

    public UnitOfWork(Repository repository)
    {
       _repository = repository;
    }

    public void Save(Entity e)
    {
        this.Track(e);
    }

    public void SubmittChanges()
    {
       _repository.Save(this.GetChanges());
    }
}

ये दोनों तत्व कैसे संबंधित हैं? UOW उन तत्वों को ट्रैक करता है जिन्हें परिवर्तित किया जाना चाहिए, और रिपॉजिटरी में उन परिवर्तनों को जारी रखने के लिए तर्क शामिल हैं, लेकिन ... कौन कॉल करता है? क्या आखिरी मायने रखता है?

इसके अलावा, कौन कनेक्शन का प्रबंधन करता है? यदि रिपॉजिटरी में कई ऑपरेशन किए जाने हैं, तो मुझे लगता है कि एक ही कनेक्शन का उपयोग करना और यहां तक ​​कि लेनदेन भी अधिक ध्वनि है, इसलिए हो सकता है कि कनेक्शन ऑब्जेक्ट को यूओओ के अंदर डाल दिया जाए और यह रिपॉजिटरी के अंदर एक के रूप में अच्छी तरह से समझ में आता है।

चियर्स


जवाबों:


7

पुन: "UOW उन तत्वों को ट्रैक करता है जिन्हें बदलने की आवश्यकता है, और रिपॉजिटरी में उन परिवर्तनों को जारी रखने का तर्क है, लेकिन ... कौन कौन है?"

आप इन वर्गों की बुनियादी जिम्मेदारियों को समझते हैं। आप कहते हैं कि प्रत्येक लेख, जो आपने पढ़ा है, उन्हें अलग-अलग तरीकों से एक साथ जोड़ता है। इसका तात्पर्य यह है कि "कौन कहता है" के बारे में निर्णय आपके ऊपर है।

मैं बाहर जबकि इस तरह के रूप में अच्छा सॉफ्टवेयर डिजाइन के बुनियादी प्रिंसिपलों द्वारा निर्देशित की जा रही 'परतों' के मामले में समस्या स्केच करने की कोशिश करता हूँ सामंजस्य , Decoupling , Reusability , यूनिट Testability आदि

एरिक इवांस डोमेन ड्रिवेन डिज़ाइन को उद्धृत करने के लिए , (2004) एडिसन वेस्ले, पृष्ठ 69 :

[स्तरित आर्केटेक्चर्स का आवश्यक प्रिंसिपल] यह है कि किसी भी लेयर का कोई तत्व केवल उसी लेयर के अन्य तत्वों पर या लेयर के तत्वों पर "उसके नीचे" पर निर्भर करता है।

मेरी राय में, दोनों UOW और रेपो दो अलग-अलग वर्ग हैं जिनकी स्पष्ट, स्वतंत्र, जिम्मेदारियां हैं। के साथ शुरू करने के लिए, मैं या तो दूसरे को आमंत्रित नहीं करूंगा।

मुझे लगता है कि आपको लेनदेन को बचाने के लिए कुछ तीसरे ग्राहक वर्ग (यानी या तो controllerया service class) की जरूरत है जो वास्तव में 'कब और क्या' को रेपो से और 'कब' से जानता है। यह क्लाइंट आर्किटेक्चर में अपेक्षाकृत अधिक बैठता है (इसलिए अधिक कक्षाओं के बारे में जान सकता है ) और दोनों के बीच कुछ ऑर्केस्ट्रेशन कर सकता है।

--------------------------------

         [Client]
           /   \
----------/---- \---------------
         /       \
        V         V
[Unit Of Work]  [Repo]


--------------------------------

2

विधियाँ आमतौर पर UOW इंटरफ़ेस को दी जाती हैं (जो आमतौर पर एक कारखाने के माध्यम से निर्मित की जाती हैं)।

आप आमतौर पर कमांड पैटर्न क्लास (es) / मुखौटा से UOW इंटरफ़ेस पर विधियाँ कहते हैं। चूंकि UOW बाद में डेटाबेस IO को डिफाइन करता है (इसलिए आपको लंबे समय तक लेन-देन करने या डेटाबेस को अनावश्यक रूप से हो सकने वाली कॉल को रोकने के लिए), UOW के साथ काम करना उसी स्तर पर होना चाहिए जो आप सामान्य रूप से अपने डेटाबेस के साथ काम करेंगे।

Microsoft की UOW पैटर्न पर बहुत गहन पोस्ट है:

http://msdn.microsoft.com/en-us/magazine/dd882510.aspx

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.