编辑:接受克里斯霍姆斯的回应,但如果有人想出更好的方法,总是准备好重构!谢谢!
使用MVP做一些winforms将实体传递给另一个视图的最佳方法是什么.
假设我有一个CustomerSearchView/Presenter,在doubleClick我想显示CustomerEditView/Presenter.我不希望我的视图知道模型,所以我不能创建一个ICustomer参数的ctor .
我的反应是,
CustomerSearchView创建一个新的CustomerEditView,创建它自己的演示者.然后我CustomerSearchView会做类似的事情:
var customerEditView = new CustomerEditView();
customerEditView.Presenter.Customer = this.Presenter.SelectedCustomer;
Run Code Online (Sandbox Code Playgroud)
其他可能的方法是一个CustomerDTO类,并使其CustomerEditView接受其中一个CustomerDTO,但我认为这是一项很简单的工作.
对不起基本的问题,但我发现的所有例子都没有达到这一点,这是一个棕色的项目,到目前为止使用的方法让我很头疼......
我不知道你具体是如何表达你的观点的,所以在这里给你具体的建议有点困难。这就是我之前做此类事情的方式:
我们所做的是让 CustomerSearchViewPresenter 触发 OpenCustomer(customerId) 之类的事件。(假设您的搜索视图只有几条客户数据,而 customerId 将是其中之一。如果您的搜索视图列出了整个客户对象,那么您可以调用 OpenCustomer(customer)。但我不会构建一个搜索视图并允许它填充整个对象...我们在数据方面保持搜索视图的轻量级。)
应用程序中的其他地方有一个事件处理程序,它侦听 OpenCustomer() 事件并执行创建带有 Presenter 的新 CustomerEditView 的任务(我将推迟到我的 IoC 容器为我做这些事情,所以我不这样做不必在任何地方使用“new”关键字)。创建视图后,我们可以将 id(或客户对象)传递给新的 CustomerEditView,然后显示它。
这个负责列出 OpenCustomer() 事件并执行 CustomerEditView 创建的类通常是我们应用程序中的某种 Controller 类。
为了进一步简化这种情况,我采用了另一种方式:在应用程序或模块启动时创建 CustomerSearchView(和演示者)和 CustomerEditView(和演示者)。当 CustomerSearchView 需要打开 Customer 进行编辑时,CustomerEditView 成为 OpenCustomer 事件的响应者,并将数据加载到自身中,并且知道如何在它应该执行的任何容器中显示自己。
所以有多种方法可以做到这一点。