Dar*_*ung 88 .net c# mvp design-patterns winforms
我正在尝试使用WinForms首次实现MVP方法.
我试图了解每一层的功能.
在我的程序中,我有一个GUI按钮,当单击时会打开一个openfiledialog窗口.
因此,使用MVP,GUI处理按钮单击事件,然后调用presenter.openfile();
在presenter.openfile()中,是否应该将该文件的开头委托给模型层,或者因为没有要处理的数据或逻辑,它应该只是对请求进行操作并打开openfiledialog窗口吗?
更新: 我已经决定提供赏金,因为我觉得我需要进一步的帮助,最好根据我的具体要点量身定制,以便我有上下文.
好的,在阅读了MVP后,我决定实施被动视图.实际上,我将在Winform上有一堆控件,由Presenter处理,然后委托给Model.我的具体要点如下:
当winform加载时,它必须获得树视图.我认为视图应该调用一个方法如:presenter.gettree(),这是正确的,这将依次委托给模型,该模型将获取树视图的数据,创建并配置它,将其返回给演示者,然后将传递到视图,然后将其简单地分配给一个面板?
对于Winform上的任何数据控件,这是否相同,因为我还有一个datagridview?
我的应用程序,有许多具有相同程序集的模型类.它还支持插件架构,其插件需要在启动时加载.视图是否只调用一个presenter方法,然后调用一个加载插件并在视图中显示信息的方法?然后哪个层控制插件引用.视图是否会引用它们或演示者?
我认为视图应该处理关于表示的每一件事,从树视图节点颜色到数据网格大小等,我是否正确?
我认为这是我的主要关注点,如果我理解这些流程应该如何,我想我会没事的.
Joh*_*ell 121
这是我对MVP和你的具体问题的谦虚态度.
首先,用户可以与之交互或仅显示的任何内容都是一种视图.这种观点的规律,行为和特征由界面描述.该接口可以使用WinForms UI,控制台UI,Web UI甚至根本没有UI(通常在测试演示者时)实现 - 只要遵循其视图界面的规律,具体实现无关紧要.
其次,视图总是由演示者控制.这种演示者的法律,行为和特征也由界面描述.只要遵守其视图界面的规律,该接口就不具体对具体视图实现感兴趣.
第三,由于演示者控制其视图,为了最大限度地减少依赖关系,因此让视图知道任何有关其演示者的内容实际上没有任何好处.演示者与视图之间存在约定的合同,并且视图界面表明了该合同.
第三个含义是:
对于您的问题,上面的代码有点简化:
interface IConfigurationView
{
event EventHandler SelectConfigurationFile;
void SetConfigurationFile(string fullPath);
void Show();
}
class ConfigurationView : IConfigurationView
{
Form form;
Button selectConfigurationFileButton;
Label fullPathLabel;
public event EventHandler SelectConfigurationFile;
public ConfigurationView()
{
// UI initialization.
this.selectConfigurationFileButton.Click += delegate
{
var Handler = this.SelectConfigurationFile;
if (Handler != null)
{
Handler(this, EventArgs.Empty);
}
};
}
public void SetConfigurationFile(string fullPath)
{
this.fullPathLabel.Text = fullPath;
}
public void Show()
{
this.form.ShowDialog();
}
}
interface IConfigurationPresenter
{
void ShowView();
}
class ConfigurationPresenter : IConfigurationPresenter
{
Configuration configuration = new Configuration();
IConfigurationView view;
public ConfigurationPresenter(IConfigurationView view)
{
this.view = view;
this.view.SelectConfigurationFile += delegate
{
// The ISelectFilePresenter and ISelectFileView behaviors
// are implicit here, but in a WinForms case, a call to
// OpenFileDialog wouldn't be too far fetched...
var selectFilePresenter = Gimme.The<ISelectFilePresenter>();
selectFilePresenter.ShowView();
this.configuration.FullPath = selectFilePresenter.FullPath;
this.view.SetConfigurationFile(this.configuration.FullPath);
};
}
public void ShowView()
{
this.view.SetConfigurationFile(this.configuration.FullPath);
this.view.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
除了上述内容之外,我通常还有一个基本IView界面,用于存储Show()我的视图通常会从中受益的任何所有者视图或视图标题.
对你的问题:
1. 当winform加载时,它必须获得树视图.我认为视图应该调用一个方法如:presenter.gettree(),这是正确的,这将依次委托给模型,该模型将获取树视图的数据,创建并配置它,将其返回给演示者,然后将传递到视图,然后将其简单地分配给一个面板?
我会打电话
IConfigurationView.SetTreeData(...)的IConfigurationPresenter.ShowView(),调用前右IConfigurationView.Show()
2. 对于Winform上的任何数据控件,这是否相同,因为我还有一个datagridview?
是的,我会呼吁
IConfigurationView.SetTableData(...).这取决于格式化给它的数据.演示者只需遵守视图的合同即它需要表格数据.
3. 我的应用程序,有许多具有相同程序集的模型类.它还支持插件架构,其插件需要在启动时加载.视图是否只调用一个presenter方法,然后调用一个加载插件并在视图中显示信息的方法?然后哪个层控制插件引用.视图是否会引用它们或演示者?
如果插件与视图相关,则视图应该知道它们,而不是演示者.如果它们都是关于数据和模型的,那么视图就不应该与它们有任何关系.
4. 我认为视图应该处理关于表示的每一件事,从树视图节点颜色到数据网格大小等,我是否正确?
是.将其视为提供描述数据的XML的演示者以及获取数据并将CSS样式表应用于其的视图.具体而言,演示者可以调用
IRoadMapView.SetRoadCondition(RoadCondition.Slippery),然后视图将道路呈现为红色.
点击节点的数据怎么样?
5. 如果我点击treenodes,我是否应该通过特定节点到达演示者,然后从演示者那里找出所需的数据,然后在将模型呈现给视图之前询问模型中的数据?
如果可能的话,我会一次性传递在视图中呈现树所需的所有数据.但是如果某些数据太大而无法从头开始传递,或者它本质上是动态的并且需要来自模型的"最新快照"(通过演示者),那么我会添加类似于
event LoadNodeDetailsEventHandler LoadNodeDetails视图界面的数据,以便presenter可以订阅它,LoadNodeDetailsEventArgs.Node从模型中获取节点的详细信息(可能通过其某种ID),以便视图可以在事件处理程序委托返回时更新其显示的节点详细信息.请注意,如果获取数据可能太慢而无法获得良好的用户体验,则可能需要使用此异步模式.
Pet*_*old 10
包含视图中所有逻辑的演示者应该响应被点击的按钮,如@JochemKempe 所说.实际上,按钮单击事件处理程序调用presenter.OpenFile().然后,演示者能够确定应该做什么.
如果它确定用户必须选择一个文件,它将回调到视图中(通过视图界面)并让包含所有UI技术的视图显示OpenFileDialog.这是一个非常重要的区别,因为不应允许演示者执行与使用中的UI技术相关的操作.
然后,所选文件将返回到演示者,继续其逻辑.这可能涉及处理文件的任何模型或服务.
使用MVP模式的主要原因是imo将UI技术与视图逻辑分开.因此,当视图使其与UI逻辑分离时,演示者协调所有逻辑.这具有使演示者完全可单元测试的非常好的副作用.
更新:由于演示者是在一个特定视图中找到的逻辑的实施例,因此视图 - 演示者关系是IMO一对一的关系.并且出于所有实际目的,一个视图实例(例如表单)与一个演示者实例交互,并且一个演示者实例仅与一个视图实例交互.
也就是说,在我使用WinForms实现MVP时,演示者总是通过表示视图UI能力的界面与视图交互.对于什么视图实现此接口没有限制,因此不同的"小部件"可以实现相同的视图接口并重用演示者类.
| 归档时间: |
|
| 查看次数: |
42481 次 |
| 最近记录: |