【问题标题】:MVP : other constructor's parameters than view and model?MVP:除了视图和模型之外的其他构造函数参数?
【发布时间】:2009-07-13 23:42:15
【问题描述】:

我正在尝试用 Delphi 2009 实现一个轻量级的 mvp 框架。

视图是被动的,但支持数据绑定(通过接口属性)。

我正面临两难境地: 我有几个非常相似的视图/演示者/模型三合会,即:

订单表单和客户表单 = 行为和逻辑相同,但数据绑定的数据源不同,表单标题也不同。数据源是我所有模型的通用属性,所以这不是问题,要设置表单标题,我不得不在我的演示者InitView 方法中对其进行硬编码

一切都很好,但我的情况是我有几个非常相似的简单 mvp 三元组。我想重构它,但在这种情况下,我必须将一些参数传递给 mvp 构造函数。

到目前为止,我正在这样做:

  1. 创建视图
  2. 创建模型
  3. 在构造函数中创建演示者并注入模型和视图

事实上,我面临着一个选择:

  1. 有一些非常通用的视图/演示器,像这样使用它们,但在构造函数中注入 1 或 2 个参数
  2. 拥有一些视图/演示者超类,并从中派生我所有类似的视图/演示者,并在覆盖的方法中设置一些特定值。

你能给我一些提示/建议吗?

(对不起,如果我不是很清楚)

【问题讨论】:

    标签: delphi design-patterns dependency-injection mvp


    【解决方案1】:

    弗雷德,

    我将选择 1 和 2 的方式是拥有一个包含通用行为的抽象视图/呈现器,并创建可能由子类实现的特定行为的抽象函数。

    例如,

      public abstract class AbstractPresenter{
          // subclass will be implemented 
          public abstract void InitView(Model model, View view);
      }
    

    然后您可能有子类,OrderFormPresenter 和 CustomerFormPresneter 从 AbstractPresenter 扩展。

    public OrderFormPresenter extends AbstractPresenter{
        public void InitView(Model model, View, view){
          // do something specific values 
        }
    }
    
    public CustomerFormPresenter extends AbstractPresenter{
        public void InitView(Model model, View, view){
          // do something specific values 
        }
    }
    

    如果方向错误,请纠正我。 希望对你有帮助。

    老虎

    【讨论】:

    • 老虎,谢谢你的回答。你的解决方案似乎是我的第二个。我同意这是一种干净的方法,但是创建几个子类只是为了设置表单标题或表单上的标签与我现在看到的相比有点矫枉过正。感谢您的帮助。
    【解决方案2】:

    我只会在需要时创建一个带有参数和子类的通用视图/演示器。

    【讨论】:

      【解决方案3】:

      另一种方法(以及我曾经解决过这个问题的方法,所以效果很好)是在模型中构建一个通用的“元数据”接口,然后视图(接口或通过类继承)使用这些通用的演示者中的界面。我选择为我的模型使用继承,为我的视图使用接口(在现有表单上添加接口比要求全面继承表单/框架更容易)。在我的解决方案中,演示者的构造函数采用 3 个参数,模型、视图和“MVP 名称”。我使用 MVP 的名称来加载特定于当前场景的设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多