Кэширование данных приложения WinForms - на каком уровне кэшировать? - PullRequest
1 голос
/ 27 февраля 2009

У нас есть данные, которые обновляются каждую ночь в базе данных, находящейся в том же экземпляре, что и база данных моего приложения. Поэтому, чтобы сэкономить на вызовах базы данных, я хочу кэшировать эти статические данные за день в List (Of MyObject). С теоретической точки зрения, должен ли этот кэшированный List (Of) кэшироваться в коде уровня представления через глобальную переменную? Должно ли оно быть в глобальной переменной в .DLL?

Я думаю о .DLL, потому что я создал сервисный уровень, который открыт для доступа к графическому интерфейсу и делает вызовы уровня доступа к данным внутри .DLL:

Public Shared Function Search(ByVal criteria As Core.Other.Customer) As List(Of Core.Other.Customer)
    ' TODO: Check the customer cache to see if it has been populated yet. If not, populate it.
    If 1 = 1 Then
        ' TODO: Variable "list" needs to be a global object in the DLL.
        ' For SO readers: Dal class declared Friend.
        Dim list As List(Of Core.Other.Customer) = Dal.Search.Customers.GetCache()
    End If

    Dim results As New List(Of Core.Other.Customer)
    ' TODO: Find the relevant customers in the cache and add them to variable "results".
    Return results
End Function

Пойду ли я об этом как можно лучше?

Ответы [ 3 ]

3 голосов
/ 27 февраля 2009

Я бы хотел кешировать это на вашем сервисном уровне. Мне нравится, чтобы мой доступ к данным был простым (обычно с использованием OR / M, например, NHibernate), поэтому я не хочу делать ничего глупого, что могло бы изменить мои ожидания о том, как работает слой доступа к данным (как разработчик, я бы ожидал, что все вызовы DAL для фактического попадания в БД, а не в кеш, если только это не был кеш OR'M, а это деталь реализации, которая меня не волнует).

Служба кажется подходящим местом (и когда я кеширую данные, я делаю это в своих приложениях, если это вообще помогает).

2 голосов
/ 27 февраля 2009

Требуется ли для вашего List (Of x) какая-либо обработка или это просто необработанные данные, извлеченные из базы данных?

Если это просто необработанные данные, извлеченные из базы данных, было бы неплохо кэшировать их на уровне доступа к данным.

Но если требуется обработка, то это должно быть сделано на уровне бизнес-логики

Поскольку вы имеете в виду код представления и .DLL, вы имели в виду n-уровневую архитектуру ?

0 голосов
/ 27 февраля 2009

Вы можете рассмотреть возможность сделать это без кэширования и посмотреть, есть ли у вас проблемы с производительностью / сетью. Это может быть преждевременная оптимизация?

...