在哪里定义存储库?

时间:2011-12-06 13:47:12

标签: mvvm entity-framework-4.1 repository

我正在学习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中创建一个存储库似乎更清晰一些。当相关的ViewModel不再使用而不是保持它直到关闭MainWindowViewModel或者这会创建太多的存储库实例时,是否不会清理存储库?

1 个答案:

答案 0 :(得分:0)

为每个ViewModel使用单独的Context时遇到的问题是,彼此链接的实体来自不同的上下文,因此您在尝试更新某些内容时必须手动解决此问题(请参阅{{3} })

这与称为工作单位的模式有关。

UoW帮助您封装应该协同工作的功能。在您的情况下,ObjectContext实现UoW模式,并在构造函数中传递给存储库。

您应该在可以协同工作的函数之间共享ObjectContext,并且应该将其视为一个工作单元。