Несколько ViewModels запрашивают один и тот же объект домена, я должен дать им одинаковые / разные экземпляры? - PullRequest
1 голос
/ 11 февраля 2011

новичок здесь, извините, если это очевидный вопрос, и извините за мой английский.Я пытался в Google, но не нашел ответа на свой вопрос.

Я использую только код Visual Studio, Autofac, EF CTP5 (возможно, позже переключится на HHibernate из-за того, что EF CTP5 не поддерживает контейнер IoC) и пытается использовать следующие шаблоны: MVVM, DI, DDD.

Мой вопрос такой: когда несколько ViewModels запрашивают один и тот же объект домена из хранилища, я должен дать им один и тот же экземпляр или создать новыйэкземпляр для каждого запроса?

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

public class PersonRepository
{
    public Person GetById(int id)
    {
        using (var dbContext = new MainDbContext())
        {
            return dbContext.Persons.Where(x => x.Id == id);
        }
    }
}

И после того, как любой ViewModle изменяет свой экземпляр домена,объект, я должен был бы найти способ уведомить все другие ViweModels, чтобы обновить их экземпляры, чтобы обеспечить целостность данных.

Если я дам один и тот же экземпляр объекта домена для всех запросов, то я думаю, я быдолжен написать что-то вроде этого:

public class PersonRepository
{
    List<Person> _cache = new List<Person>();
    public Person GetById(int id)
    {
        var person = getFromCache(id);
        if (person == null)
        {
            person = getFromDatabase(id);
            _cache.Add(person);
        }
        return person;
    }
}

И мне также нужно найти способ удалить экземпляры из кэша, когда они не нужныy ViewModels (или использовать слабую ссылку на кеш), чтобы избежать утечки памяти.

Какой путь мне выбрать?У меня есть варианты получше?

Спасибо!

Редактировать: Изменено содержимое для лучшего описания.

(извините за мой английский)

Обновление:

После того, как я провел некоторое исследование по этому вопросу, я понял, что этот вопрос слишком запутанный, поэтому я разместил новый вопрос здесь: Несколько моделей представления модифицируют один и тот же объект домена

1 Ответ

0 голосов
/ 11 февраля 2011

Если вы думаете о нескольких экземплярах, которые возникают из-за нескольких пользователей, вы, вероятно, захотите создать один экземпляр модели представления и получить представление о том, как это сделать, используя ORM и базу данных, что подразумевает понимание optimistic v пессимистическая блокировка . Вот ссылка, которая содержит информацию о том, как EF поддерживает это , хотя я лично использую NHibernate. Я также рекомендовал бы, чтобы вы предпочли оптимистическую блокировку.

Если вы говорите о нескольких представлениях одного и того же предметного объекта (т. Е. Человека) в одном случае использования, вам, вероятно, потребуются разные модели представлений, хотя возможно использование нескольких экземпляров одной и той же модели представлений. В любом случае, синхронизация здесь не будет ответственностью базы данных. Вот хорошая ссылка, которая исследует различные возможности с уклоном в сторону агрегатора событий .

НТН,
Berryl

P.S. Просто увидел, что вы кешируете вещи в своем хранилище. Хотя это отличное соображение, лучше всего оставить управление кэшем своему ORM (т. Е. EF, NHibernate), а затем понять, как его настроить, если и когда это необходимо. Например, стандартное поведение для NHib будет кэшироваться разумно и соответствующим образом в типичных сценариях.

...