2010-09-12 72 views
0

這就是方式,約什 - 史密斯是做加法-A-客戶程序:從Controller或ViewModel調用存儲庫的CRUD方法?

**CustomerViewModel**.cs: 
    public void Save() 
    { 
     _customerRepository.AddCustomer(_customer); 
    } 

     **CustomerRepository**.cs: 
     public void AddCustomer(Customer customer) 
       { 
     //... 
         _customers.Add(customer); 

         if (this.CustomerAdded != null) 
          this.CustomerAdded(this, new CustomerAddedEventArgs(customer)); 

       } 

     **AllCustomersViewModel**.cs(acts as Controller): 
     void OnCustomerAddedToRepository(object sender, CustomerAddedEventArgs e) 
       { 
        var viewModel = new CustomerViewModel(e.NewCustomer, _customerRepository); 
        this.AllCustomers.Add(viewModel); 
       } 

強大的文本 Wouldn`t它是更好地做到這一點?:

**CustomerViewModel**.cs: 
public void Save() 
{ 
    if (this.CustomerAdded != null) 
         this.CustomerAdded(this, new CustomerAddedEventArgs(customer)); 
} 

    AllCustomersViewModel.cs(acts as Controller): 
    void OnCustomer**ADDING**ToRepository(object sender, CustomerAddedEventArgs e) 
      { 
       _customerRepository.Add(e.NewCustomer); 
       var viewModel = new CustomerViewModel(e.NewCustomer); 
       this.AllCustomers.Add(viewModel); 
      } 

這一步CustomerViewModel.cs也可以在控制器中,因爲控制器對客戶/產品/訂單等的服務/存儲庫持有1 /全部參照...

if (this.IsNewCustomer) 
       _customerRepository.AddCustomer(_customer); 

當我現在仍然有一個Order/ProductViewModel爲同一個控制器工作時,我有3個存儲庫實例。如果存儲庫將在控制器的Ctor實例化,我只有一個實例。

隨着喬希史密斯體系結構,你在控制器和CustomerViewModel中有一個customerRepo。

用我的想法,您在控制器中只有一個customerRepo,而CustomerViewModel的Save/Add方法可以訂閱Controllers OnAddCustomer方法。

爲什麼約什 - 史密斯花了

public event EventHandler<CustomerAddedEventArgs> CustomerAdded; 

,而不是一個

simple public Action<Customer> AddDocumentDelegate; 

你覺得呢?你認爲我的想法有什麼缺點嗎?

回答

0

你的想法是對的。 viewModel應該是你模型的視圖特定表示,它不應該調用你的倉庫。您的控制器可以監聽來自視圖的事件(按鈕點擊,提交等),然後調用存儲庫。

有關於這個主題的其他職位,你應該檢查 -

http://www.weask.us/entry/mvvm-put-data-access-layer

MVVM where to put Data Access Layer?

+0

我還是又想起了它,看到我的想法有缺陷,有5000 CustomerViewModel對象在各做各的添加/保存方法:OnCustomerAdd(客戶),這樣我就必須聲明5000個事件erhm ...讀你的鏈接大聲笑現在我很困惑... – Elisabeth 2010-09-12 19:34:03

+0

是的..讓你的意見調用適當的方法在控制器上。因此,當用戶操作提示您保存時,只需從視圖中調用保存在控制器上,然後控制器將執行數據訪問。 – 2010-09-12 20:09:18

+0

正是我所觀察到的:josh smith在CustomerViewModel中有一個AddCustomer方法(保存),WAF(WPF應用程序框架)在BookController中具有AddCustomer/AddBook方法。視圖只是視圖的一個模型,所以它必須是關於誘導數據持久性等的鈍化......這就是控制器的工作。嗯似乎我得深入瞭解一下WAF相當大的應用程序,但充分考慮了架構:P – Elisabeth 2010-09-12 20:37:13