从Controller或ViewModel调用存储库的CRUD方法?

时间:2010-09-12 19:16:59

标签: wpf mvvm repository viewmodel

这就是josh smith正在进行添加客户程序的方式:

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

强文这样做会不会更好?:

 **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中的这一步也可以在Controller中,因为Controller保存对客户/产品/订单等的服务/存储库的1 /所有参考...

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

当我现在仍然有一个Order / ProductViewModel为同一个控制器工作时,我有3个存储库实例。如果存储库位于控制器的Ctor实例化中,那么我只有一个实例。

使用josh smith架构,您在Controller AND CustomerViewModel中拥有customerRepo。

根据我的想法,您在控制器中只有一个customerRepo,并且CustomerViewModel的Save / Add方法可以订阅Controllers OnAddCustomer方法。

乔希史密斯为什么选择

public event EventHandler<CustomerAddedEventArgs> CustomerAdded;

而不是

simple public Action<Customer> AddDocumentDelegate;
你怎么看?你觉得我的想法有什么不利之处吗?

1 个答案:

答案 0 :(得分:0)

你的想法是对的。 viewModel应该是模型的视图特定表示,不应该调用您的存储库。您的控制器可以从视图中侦听事件(按钮单击,提交等),然后调用存储库。

您应该检查此主题的其他帖子 -

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

MVVM where to put Data Access Layer?