模型视图Presenter被动视图实现

时间:2014-05-05 09:52:58

标签: c# design-patterns mvp

我目前正在使用C#在我的.NET Compact Framework项目中使用Model View Presenter Passive View。现在,在我的模型中,我有很多来自C / C ++ DLL的Pinvoke。我的项目是硬件测试设备,通常带按钮和大型LCD触摸屏。然后它收集数据(使用一些数据库)并传输到PC。

我创建了一个模型接口,实现它的类调用了那些Pinvoke方法。一个原因是我想在模型中封装Pinvoke和编组,互操作。

现在我有一位主持人。示例场景:用户按下按钮,然后视图上的click事件将在演示者上调用方法(通过接口),然后最终调用模型的方法(再次通过接口)。

现在,在我看来,演示者主要成为模型业务逻辑的包装器。如果我向模型添加一些方法,我还需要通过接口添加该方法,因为视图的按钮需要调用模型中的一些方法。我觉得间接太多了。一个例子是,在模型中,我有一个线程来等待C / C ++ DLL推送的事件。现在,我在Presenter上有一个线程,它使用一个观察者模式来排队和处理来自模型的事件(更改屏幕视图并告诉用户发生了什么)。

伪代码     从界面来看:     void viewChangeTestResultsText(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执行测试。间接引起了一些痛苦,因为我有很多方法调用来实现,项目的截止日期非常紧张。

对于我的项目,还有另一种变体,我知道我需要一个可更改的演示者,因此,我还需要一个可更改的模型,因为虽然有很多相似之处,但业务逻辑在某种程度上是不同的。现在,我正在考虑将模型中的所有逻辑推送到演示者,以便我只维护演示者视图中的逻辑并仅将模型用于数据处理(数据库,配置,设置),我认为在开发和代码维护方面会更简单,但我不确定在灵活性方面的影响。

这是我第一次在被动视图中使用MVP。我不确定我是否遗漏了有关正确实施MVP的事情。对此有何想法或建议?

1 个答案:

答案 0 :(得分:1)

你对MVP的理解似乎很好;您已正确区分表示逻辑(执行测试,同步视图)和域逻辑(PInvoke)。使用您设置的接口,您可以轻松地对演示者进行单元测试(这是使用MVP的主要优势之一)。

我建议不要将所有逻辑放在演示者中,因为这可能导致God Object

关于您可更改的演示者问题,我不确定您的意思。您是否意味着每种类型的设备都需要不同的演示者/模型?如果是这样的话,对于每种类型的设备,如果它们彼此足够不同,则具有MVP三元组似乎是完全合理的。如果您确定它们之间的共同特征,则可以使用继承或实用程序类来提供公共代码。