Где определить хранилище? - PullRequest
0 голосов
/ 06 декабря 2011

Я изучаю EF4.1 вместе с MVVM, и в одном из этих учебных пособий они создают MainWindowViewModel с объектом Repository, который они используют при вызове другой модели представления (EmployeeListViewModel). Вот код:

public MainWindowViewModel()
{
    IObjectContextAdapter adapter = ((IObjectContextAdapter)new SidekickEntities());
    _vmRepository = new GenericRepository(adapter.ObjectContext);
    EmployeeListViewModel viewModel = new EmployeeListViewModel(_vmRepository);
    this.ViewModels.Add(viewModel);
}


public EmployeeListViewModel(GenericRepository repository)
{

    if (repository == null)
    {
        throw new ArgumentNullException("repository");
    }

    _employeeRepository = repository;
    this.AllEmployees = new ObservableCollection<Employee>(_employeeRepository.GetAll<Employee>());
}

Что мне интересно, так это то, почему репозиторий создается в MainWindowViewModel и затем передается в EmployeeListViewModel? Почему бы просто не создать хранилище в EmployeeListViewModel следующим образом:

public MainWindowViewModel()
{
    EmployeeListViewModel viewModel = new EmployeeListViewModel();
    this.ViewModels.Add(viewModel);
}


public EmployeeListViewModel()
{
    IObjectContextAdapter adapter = ((IObjectContextAdapter)new SidekickEntities());
    _employeeRepository = new GenericRepository(adapter.ObjectContext);
    this.AllEmployees = new ObservableCollection<Employee>(_employeeRepository.GetAll<Employee>());
}

Я довольно новичок в EF, но кажется немного чище создать репозиторий в каждой отдельной ViewModel. Не будет ли затем очищаться хранилище, когда рассматриваемая модель больше не используется, вместо того, чтобы хранить его до закрытия MainWindowViewModel, или это создает слишком много экземпляров хранилища?

1 Ответ

0 голосов
/ 06 декабря 2011

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

Это связано с шаблоном, называемым Unit Of Work.

UoW помогает вам инкапсулировать функции, которые должны работать вместе.В вашем случае ObjectContext реализует шаблон UoW и передается в хранилище в конструкторе.

Вы должны совместно использовать свой ObjectContext между функциями, которые работают вместе и должны рассматриваться как одна единица работы.

...