2011-12-06 7 views
0

私はMVVMと一緒にEF4.1を学習しています。これらのチュートリアルの1つでは、別のビューモデル(EmployeeListViewModel)を呼び出す際に使用するリポジトリオブジェクトを持つMainWindowViewModelを作成します。ここでは、コードは次のようになります。リポジトリを定義する場所はどこですか?

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に渡される疑問に思って?私はEFにかなり新しいですが、それぞれ別々のViewModelにリポジトリを作成するために少しクリーナー思わ

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>()); 
} 

:なぜ、ちょうどこのようEmployeeListViewModelでリポジトリを作成しません。問題のViewModelが、MainWindowViewModelが終了するまでそれを保持するのではなく、もはや使用されなくなったときに、リポジトリをクリーンアップしないでください。

答えて

0

あなたは、各ビューモデルに別々のコンテキストを使用しているときに実行される問題は、あなたが何かを更新しようとすると、手動でこれをうまくする必要がありますので、お互いへのリンクを持っているエンティティが異なるコンテキストから来たということである

Attaching and Detaching Objectsを参照してください)

これはUnit Of Workと呼ばれるパターンと関係があります。

UoWは、一緒に機能する関数をカプセル化するのに役立ちます。あなたのケースでは、ObjectContextはUoWパターンを実装し、コンストラクタのリポジトリに渡されます。

ObjectContextは、一緒に動作し、1つの作業単位として見なされる関数間で共有する必要があります。

+0

よろしくお願いいたします。私が開発に行き過ぎる前にそれを知ってうれしい! :) – BrianKE

関連する問題