这就是方式,约什 - 史密斯是做加法-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;
你觉得呢?你认为我的想法有什么缺点吗?
我还是又想起了它,看到我的想法有缺陷,有5000 CustomerViewModel对象在各做各的添加/保存方法:OnCustomerAdd(客户),这样我就必须声明5000个事件erhm ...读你的链接大声笑现在我很困惑... – Elisabeth 2010-09-12 19:34:03
是的..让你的意见调用适当的方法在控制器上。因此,当用户操作提示您保存时,只需从视图中调用保存在控制器上,然后控制器将执行数据访问。 – 2010-09-12 20:09:18
正是我所观察到的:josh smith在CustomerViewModel中有一个AddCustomer方法(保存),WAF(WPF应用程序框架)在BookController中具有AddCustomer/AddBook方法。视图只是视图的一个模型,所以它必须是关于诱导数据持久性等的钝化......这就是控制器的工作。嗯似乎我得深入了解一下WAF相当大的应用程序,但充分考虑了架构:P – Elisabeth 2010-09-12 20:37:13