2010-09-12 70 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