2010-11-11 13 views
5

समस्या

हमारे पास एक जटिल डोमेन मॉडल है। प्रदर्शन समस्याओं से बचने के लिए, सूची (डोमेन ऑब्जेक्ट्स से उत्पन्न) की अधिकांश कैश हैं। पहले डोमेन ऑब्जेक्ट में बदलाव होने तक सबकुछ ठीक से काम करता है। कैश में सभी निर्भर सूची को ताज़ा किया जाना चाहिए - सवाल यह है कि कैसे?डोमेन ऑब्जेक्ट में परिवर्तन -

उदाहरण

  • डोमेन वस्तु: हाउस
  • कार्रवाई: एक घर का नाम
  • बदल दिया गया है
  • प्रभाव: सभी सूची (containts घर नाम) कर रहे हैं बाहर के- तिथि, ताज़ा करें

समाधान

कोई संदेह नहीं है, एक बहुत ही आसान तरीका है: डोमेन ऑब्जेक्ट को सहेजने के बाद, हम मैन्युअल रूप से कोड से सभी सूची रीफ्रेश करते हैं।

छद्म कोड

repository.Save(save); 

cacheManager.Invalidate("HouseList"); 
cacheManager.Invalidate("OrderedHouseList"); 
cacheManager.Invalidate("HousecombinedWithResidentsList"); 
... 

तो समस्या है: हम सब कुछ स्वयं ताज़ा करने के लिए है। मैं बेहतर समाधान के लिए देख रहा हूँ, मान लें: डब्ल्यू

  • पहलू उन्मुख रास्ता/PostSharp या विंडसर
  • पर्यवेक्षक या घटना आधारित तकनीक
  • CQRS यह प्रश्नों और आदेशों को अलग करने के बारे में है, लेकिन इस अवधारणा शायद बहुत है बहुत।

कोई विचार या अनुभव?

उत्तर

1

इस प्रश्न का उत्तर जटिल है क्योंकि आपकी आवश्यकताओं को अस्पष्ट नहीं है। क्या डेटा बाँध सकता है? यदि हां, तो कब तक?

आपकी पोस्ट में सीमित जानकारी के आधार पर, मैं "कैश किए गए" विचारों को वास्तविक डेटा पर केवल एक प्रश्न होने का सुझाव दूंगा। प्रश्न स्वयं समय-समय पर कुछ कैद किए गए परिणामों को अपने कैश किए गए परिणामों को ताज़ा कर सकते हैं।

+0

अच्छा अनुवर्ती प्रश्न। –

+0

"क्या डेटा बाँध सकता है? यदि हां, तो कब तक?": शायद 1 घंटा, शायद 1 वर्ष। मुख्य समस्या एक अस्थिर व्यापार डोमेन से आता है। – boj

0

मैं कहूंगा कि, यदि आपका सम्मिलित/अद्यतन/हटाएं उन सूचियों में से किसी एक की सामग्री को संशोधित करता है, तो आपको सूची की आवश्यकता होनी चाहिए। मेरे पास मेरे ऐप में कुछ कैश किए गए डेटाटेबल्स हैं, और मैं उन्हें बनाए रखने के लिए नीचे दी गई संरचना का संग्रह उपयोग करता हूं। इस तरह, पूरे कैश को साफ़ करना आसान है, और जब मैं किसी विशेष डेटाटेबल के लिए पूछता हूं तो मैं यह देखने के लिए जांच करता हूं कि कैश में कोई मौजूद है या नहीं।

Protected Structure CachedDT 

    #Region "Local Variables" 

    Public TheDT As DataTable 
    Public TheExpirationTime As DateTime 
    Public TheUniqueIdentifier As String 

    #End Region 'Local Variables 

End Structure 

Protected cCachedDTs As Dictionary(Of String, CachedDT) = New Dictionary(Of String, CachedDT) 

ये क्वेरी बेस डेटाबेस में ऑब्जेक्ट्स के लिए मेरी बेस क्लास में रहते हैं। कैश की गई datatables का उपयोग करने का एक उदाहरण है:

<System.Diagnostics.DebuggerStepThrough> _ 
    Public Overrides Function GetPermissionsSystem(ByVal SystemUserName As String) As DataTable 
     Try 
      Dim oCmd As New SqlCommand 
      Dim aDpt As New SqlDataAdapter 
      Dim aDst As New DataSet 
      Dim theCached As CachedDT 
      Dim theCacheName As String = "GetPermissionsSystem|" & SystemUserName 
      If cCachedDTs.ContainsKey(theCacheName) Then 
       theCached = cCachedDTs.Item(theCacheName) 
       If theCached.TheExpirationTime < DateTime.Now Then 
        cCachedDTs.Remove(theCacheName) 
       Else 
        Return theCached.TheDT 
       End If 
      End If 
      With oCmd 
       .Connection = MyBase.Conn 
       .CommandType = CommandType.StoredProcedure 
       .CommandTimeout = MyBase.TimeoutShort 
       .CommandText = Invoicing.GetPermissionsSystem 
       .Parameters.Add(GP("@SystemUserName", SystemUserName)) 
      End With 
      aDpt.SelectCommand = oCmd 
      aDpt.Fill(aDst) 
      theCached = New CachedDT 
      With theCached 
       .TheUniqueIdentifier = theCacheName 
       .TheExpirationTime = DateTime.Now.AddSeconds(10) 
       .TheDT = aDst.Tables(0) 
      End With 
      cCachedDTs.Add(theCached.TheUniqueIdentifier, theCached) 
      Return aDst.Tables(0) 
     Catch sqlex As SqlException 
      MyBase.HandelEX(sqlex) 
     Catch ex As Exception 
      MyBase.HandleEX(ex) 
     Finally 
      MyBase.CloseConn() 
     End Try 
    End Function 

उपरोक्त उदाहरण में, समारोह कैश की जाँच करता है देखने के लिए एक उपयुक्त वस्तु मौजूद है या नहीं। यदि ऐसा होता है, तो डेटाबेस को फिर से मारने के बजाए वह वापस आ जाता है। अंत में, ताजा वस्तु कैश में जोड़ दी जाती है।

आपको केवल कैश से किसी विशेष सूची को हटाने का कुछ साधन प्रदान करना होगा। फिर, जब आप कोई सम्मिलित/अद्यतन/हटाते हैं, तो सुनिश्चित करें कि आप उचित आइटम साफ़ कर लें।

+0

कोड # के बजाय वीबी में कोड क्षमा करें। http://www.developerfusion.com/tools/convert/csharp-to-vb/ इसे आपके लिए परिवर्तित कर देगा, अगर यह उचित ध्वनि समाधान है। –

+0

धन्यवाद, लेकिन यह केवल कैशिंग के बारे में है (मैं एंटीलिब कैश एप्लिकेशन ब्लॉक पसंद कर रहा हूं) और जटिल कैश रीफ्रेशिंग के बारे में नहीं। – boj

संबंधित मुद्दे