模型视图呈现器被动视图实现
本文关键字:视图 被动 实现 模型 | 更新日期: 2023-09-27 18:01:47
我目前使用c#在我的。net紧凑框架项目中使用模型视图演示器被动视图。现在,在我的模型中,我有很多来自C/c++ DLL的Pinvoke。我的项目是一个硬件测试设备,通常带有按钮和大型LCD触摸屏。然后它收集数据(使用一些数据库)并传输到PC。
我创建了一个模型接口,实现它的类调用那些Pinvoke方法。一个原因是我想在模型中封装Pinvoke和封送的互操作。现在我有一个演示者。一个示例场景:用户按下一个按钮,然后视图上的click事件将调用呈现器上的方法(通过接口),然后最后调用模型的方法(再次通过接口)。
现在,在我看来,呈现者似乎正在成为模型业务逻辑的包装器。如果我向模型添加一些方法,我还需要通过接口添加那个方法,因为视图的按钮需要调用模型中的一些方法。我觉得有太多的间接。一个例子是,在模型中,我有一个线程等待由C/c++ DLL推送的事件。现在,我在演示器上有一个线程,它使用观察者模式来排队和处理来自模型的事件(改变屏幕视图并告诉用户正在发生什么)。
伪代码从界面的角度来看:void viewchangetestresulttext (string Text);
from the interface of presenter:
void PerformTest();
on the concrete class the implements the interface of presenter:
void PerformTest()
{
interfaceView.viewChangeTestResultsText("Test Started");
interceModel.PerformTest();
}
on the interface of Model:
void PerformTest();
on the concrete class of the Model:
PerformTest()
{
ModelPinvokeMethods.PerformTest();
}
在这段代码中,按钮单击处理程序调用演示器中的performtest,然后演示器调用模型中的performtest。然后模型调用pinvoke performtest。这种间接方式已经造成了一些痛苦,因为我有很多方法调用要实现,而且项目的最后期限很紧。
对于我的项目,有另一个变体,我知道我将需要一个可变的演示者,有了这个,我也需要一个可变的模型,因为业务逻辑在某种程度上是不同的,尽管有很多相似之处。现在,我正在考虑将模型中的所有逻辑都推给演示者,这样我就只需要维护演示者视图上的逻辑,并且只使用模型进行数据处理(数据库、配置、设置),我认为这在开发和代码维护方面会更简单,但我不确定在灵活性方面会有什么影响。
这是我第一次在被动视图下使用MVP。我不确定我是否错过了一些关于MVP的正确实施。对此有什么想法或建议吗?
你对MVP的理解似乎很好;您已经正确地区分了表示逻辑(执行测试,同步视图)和域逻辑(PInvoke)。有了你已经设置的接口,你可以很容易地对演示者进行单元测试(这是使用MVP的主要优点之一)。
我建议不要把所有的逻辑放在演示器中,因为这可能导致一个God Object。
关于你多变的主持人问题,我不太明白你的意思。你的意思是每种类型的设备都需要不同的演示者/模型吗?如果是这样的话,如果每种类型的设备彼此之间有足够的区别,那么为它们设置一个MVP-triad似乎是完全合理的。如果您确定了它们之间的共同特征,您可以使用继承或实用程序类来提供共同的代码。