0

曾几何时,我写了一段代码,随着时间的推移,它开始有味道。它没有以易于测试的方式编码。每个子窗口都与以数据库为中心的 Microsoft 控件(如 BindingNavigator 等)紧密耦合。但是有一天,我厌倦了自己的代码,因为它不可重用、不可测试或不可理解(即使是我自己)。

在阅读了将表示与业务逻辑和数据库访问/持久性分开的更好方法之后,我想到了第一个重大变化。然后我可以为我的子表单调用演示者,比如说“MainForm”。

现在,我有一堆演示者、视图、存储库、模型和接口,我想将它们组织成一个“标准”项目结构(例如,业务、模型、UI、测试等项目)。有人可以公开这样的结构,如果可能的话,他们在每个结构中使用的示例文件夹?

另外,我应该使用唯一的“MainPresenter”吗?或者最好为我将使用的每个儿童表格设置一个,例如:

var searchReceivalPresenter = new SearchReceivalsPresenter(
       new SearchReceivalsForm { MdiParent = this }, new SearchReceivalsRepository());

在我看来,我应该保留几个演讲者。

提前致谢,

4

1 回答 1

1

我觉得这里可能对 MVP 有一些误解——我写了一篇关于如何用 Windows Phone 7 做 MVP 的文章,但是我涵盖了 MVP 的基础知识,你应该能够理解一般理论,然后将其应用到 WinForms:

使用 MVP 模式开发 WP7 应用程序

但是为了快速回答你的问题,每个 Form 都应该实现一个 View 接口,每个 Presenter 应该处理 1 个且只有 1 个 View 接口。

当您想要打开子表单时,WinForms 变得棘手。我最终做的是让父 Presenter 直接在子 Presenter 上调用 Show 方法。然后,子 Presenter 将使用依赖注入来实例化相关 View 接口的实现。

更新 (因为我没有完全回答这个问题):)

让我描述一下我用于 winforms/MVP 应用程序的项目结构:

/ - solution root

/[App]Core - project that contains the Model - pure business logic
/[App]Core/Model - data model (lowercase "m"), POCOs
/[App]Core/Daos - data access layer (all interfaces)
/[App]Core/Services - business logic classes (interfaces and implementations)

/[App]Ui - project that contains all UI-related code, but is UI-agnostic
/[App]Ui/Model - contains POCOs that are used by the UI but not the Core
/[App]Ui/Presenters - contains presenters
/[App]Ui/Views - contains view interfaces

/[App][Platform] - project that contains all UI-specific code (e.g. WinRT, WinPhone, WinForms, WPF, Silverlight, etc)
/[App][Platform]/Daos - implementation of DAO interfaces defined in [App]Core
/[App][Platform]/Services - implementation of business logic interfaces defined in [App]Core
/[App][Platform]/Views - implementation of view interfaces defined in [App]Ui

这更像你要求的吗?

于 2013-05-07T05:17:51.220 回答