2010-11-11 11 views
5

Problem

Mamy złożony model domeny. Aby uniknąć problemów z wydajnością, większość listy (wygenerowanej z obiektów domeny) jest buforowana. Wszystko działa dobrze, dopóki nie zmieni się pierwszy obiekt domeny. Cała lista zależna w pamięci podręcznej musi zostać odświeżona - pytanie brzmi: jak?Zmiany obiektu domeny - odśwież na potrzebnych buforowanych listach

Przykład

  • Domain obiekt: Dom
  • Action: Nazwa domu została zmieniona
  • Effect: wszystkie (nazwy containts House) liście są out-of data, odśwież potrzebne

Rozwiązania

Bez wątpienia istnieje bardzo prosty sposób: po zapisaniu obiektu domeny odświeżamy ręcznie wszystkie listy z kodu.

kod Pseudo

repository.Save(save); 

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

Więc problem jest: musimy odświeżyć wszystko ręcznie. Szukam lepszych rozwiązań, powiedzmy:

  • Aspect zorientowane sposób w/PostSharp lub Windsor
  • obserwator lub techniki oparte o wydarzeniu
  • CQRS chodzi o oddzielenie zapytań i poleceń, ale ta koncepcja jest może zbyt dużo.

Każdy pomysł czy doświadczenie?

Odpowiedz

1

Odpowiedź na to pytanie jest złożona, ponieważ Państwa wymagania są niejasne. Czy dane mogą być nieaktualne? Jeśli tak, to jak długo?

Na podstawie ograniczonych informacji w twoim poście sugerowałbym, aby widoki "buforowane" były jedynie zapytaniem o rzeczywiste dane. Same zapytania mogą okresowo odświeżać buforowane wyniki z pewnym odstępem czasu.

+0

Dobre pytania uzupełniające. –

+0

"Czy dane mogą być nieaktualne? Jeśli tak, to jak długo?": Może 1 godzina, może 1 rok. Głównym problemem jest niestabilna dziedzina biznesu. – boj

0

Powiedziałbym, że jeśli twoja wstawka/aktualizacja/usuń modyfikuje zawartość jednej z tych list, powinieneś zażądać listy. Mam trochę buforowanych danych w mojej aplikacji i używam kolekcji struktury poniżej, aby je zachować. W ten sposób można łatwo wyczyścić całą pamięć podręczną, a kiedy pytam o konkretny datatable, sprawdzam, czy istnieje w pamięci podręcznej, która nie wygasła.

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) 

Te żyją w mojej klasie bazowej dla obiektów, które wysyłają zapytania do baz danych. Przykładem wykorzystania pamięci podręcznej DataTables jest:

<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 

W powyższym przykładzie, funkcja sprawdza pamięć podręczną, aby zobaczyć, czy odpowiedni obiekt istnieje. Jeśli tak, to zostanie zwrócone, zamiast ponownie trafiać do bazy danych. Na końcu świeży obiekt jest dodawany do pamięci podręcznej.

Wszystko, co musisz zrobić, to podać sposób usunięcia określonej listy z pamięci podręcznej. Następnie, po wykonaniu operacji wstawiania/aktualizowania/usuwania, upewnij się, że wyczyściłeś odpowiedni element.

+0

Niestety kod jest w VB, a nie C#. http://www.developerfusion.com/tools/convert/csharp-to-vb/ przekonwertowałoby to dla ciebie, jeśli jest to odpowiednie rozwiązanie dźwiękowe. –

+0

Dzięki, ale to tylko o buforowaniu (wolę blokowanie aplikacji EntBib Cache), a nie o złożonym odświeżaniu bufora. – boj

Powiązane problemy