Как избежать лишнего второго запроса к базе данных с использованием шаблона MVVM? - PullRequest
1 голос
/ 06 ноября 2010

Как избежать избыточного второго запроса к базе данных с использованием шаблона MVVM на модели представления:

public class DataFormViewModel : INotifyPropertyChanged
{
    private int companyId
    public int CompanyId
    {
        get { return companyId; }
        set 
        { 
            companyId = value; 
            RaisePropentyChanged("FindingStatuses");
            RaisePropentyChanged("StatusCount");
        }
    }

    public List<FindingStatus> FindingStatuses
    {
        get 
        {
            return FindingStatusService.GetAvalableStatuses(CompanyId);
        }
    }

    public int StatusCount
    {
        get { return FindingStatuses.Count; }
    }
}

т.е. если CompanyId было изменено с помощью DataBinder, будет выполнено FindingStatuses, а затем будет выполнено StatusCount, что снова выполнит FindingStatuses.

Ответы [ 3 ]

2 голосов
/ 06 ноября 2010

Я не уверен, что в первую очередь привязал бы свойство напрямую к операции с базой данных. Почему бы не иметь локальный List<FindingStatus>, представляющий «последние выбранные» статусы, а затем явно обновить его?

Помимо всего прочего, доступ к свойству обычно , как ожидается, будет достаточно дешевым - выполнение вызова базы данных каждый раз, когда доступ к любому из этих свойств звучит для меня как плохая идея.

0 голосов
/ 06 ноября 2010

Лучший способ избежать множественных (и бесполезных) запросов к базе данных - реализовать простой уровень кэширования на уровне доступа к данным.

1 - спросить кеш, если он уже обновил результат 2-Еще запрос к базе данных

Вот класс кеша, который вы можете попробовать: http://www.codeproject.com/KB/recipes/andregenericcache.aspx

0 голосов
/ 06 ноября 2010

Как уже упоминал Джон, доступ к свойствам, как ожидается, будет дешевым, то, что вы можете сделать тысячу раз без каких-либо побочных эффектов.

Я бы кешировал результат доступа к вашей базе данных и возвратил бы кешированный объект на любомзапрос.Т.е.

private IList<FindingStatus> _findingStatuses;
public IList<FindingStatus> FindingStatuses
{
    get 
    {
        if (_findingStatuses == null) 
        {
             _findingStatuses = FindingStatusService.GetAvalableStatuses(CompanyId);
        }

        return _findingStatuses;
    }
}

И тогда вам, конечно, придется очистить кеш перед тем, как поднять уведомление

public int CompanyId
{
    get { return companyId; }
    set 
    { 
        companyId = value;

        _findingStatuses = null;
        RaisePropentyChanged("FindingStatuses");

        RaisePropentyChanged("StatusCount");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...