【问题标题】:Call the repository`s CRUD-methods from the Controller or ViewModel?从 Controller 或 ViewModel 调用存储库的 CRUD 方法?
【发布时间】:2010-09-12 19:16:59
【问题描述】:

这就是 josh smith 执行 add-a-customer-procedure 的方式:

**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 拥有对 Customer/Product/Order 等的 Service/Repository 的 1/所有引用...

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

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

使用 josh smith 架构,您在 Controller 和 CustomerViewModel 中有一个 customerRepo。

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

乔什·史密斯为什么要参加比赛

public event EventHandler<CustomerAddedEventArgs> CustomerAdded;

不是一个

simple public Action<Customer> AddDocumentDelegate;

你怎么看?你觉得我的想法有什么缺点吗?

【问题讨论】:

    标签: wpf mvvm repository viewmodel


    【解决方案1】:

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

    您应该查看有关此主题的其他帖子 -

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

    MVVM where to put Data Access Layer?

    【讨论】:

    • 我仍然想了想,发现我的想法有一个缺陷:有 5000 个 CustomerViewModel 对象,每个对象都在 A​​dd/Save 方法中执行: OnCustomerAdd(customer) ,这样我必须声明 5000 个事件 erhm。 .. 必须阅读您的链接 LOL 现在我很困惑...
    • 是的 .. 让您的视图调用控制器上的适当方法。因此,当用户操作提示您保存时,只需从视图中调用控制器上的保存,然后控制器将执行数据访问。
    • 正如我所观察到的:josh smith 在 CustomerViewModel 中有一个 AddCustomer 方法(保存),WAF(WPF 应用程序框架)在 BookController 中有 AddCustomer/AddBook 方法。视图只是视图的模型,因此它必须在诱导数据持久性等方面是被动的……这就是控制器的工作。嗯,看来我得更深入地了解 WAF 相当大的应用程序但充满了架构:P
    • 我是否必须将 CRUD-ICommands + ViewModels 的操作/方法(如 Add/Del 等)放入我的控制器中?我可以在控制器中执行此操作: myNewCustomerViewModel.AddCustomerDelegate += new Action(O​​nAddCustomer);这对我来说看起来不错。最后,我有 ViewModels,其有关图形表示/gui逻辑的状态由控制器驱动。对我来说更有意义。见鬼,我真的不喜欢 josh smith msdn 的文章...根本没有准备好生产...
    • 见鬼......我犯了一个错误。 CustomerViewModel (josh smith) 是带有 SAVE 按钮的详细视图。 “DocumentListViewModel”(WAF)是一个列表视图,因此它可以有/必须有一个删除/添加按钮/命令。无法删除详细视图...只有您使用该工作区垃圾,没有人希望被用于 winforms 用户界面....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多