【问题标题】:Correct architecture for presentation objects that implement same interface实现相同接口的表示对象的正确架构
【发布时间】:2014-04-24 18:08:55
【问题描述】:

在我的项目的域模型中,我有大量的类实现相同的接口 IProduct:电话、平板电脑、DataPackage、附件等。

我希望此产品的不同组合显示在不同的产品列表页面上。这意味着,我从域层获得了表示层中的列表。现在,我想知道为每个接口实现绑定不同视图的正确方法是什么?

我看到了两种方法:

  1. 在 IProduct 接口中有一个属性\方法,用于定义需要显示产品时将选择的视图。一方面,它有助于将显示逻辑封装到类中,并为每个产品调用类似 product.Display() 的方法。另一方面,这会导致在域模型中添加一些显示逻辑,这在我看来并不好。
  2. 在表示层中有一个工厂,可以分析产品的类型并绑定正确的表示。

哪一个更可取?也许有更多的模式可以做到这一点?

【问题讨论】:

    标签: c# asp.net-mvc design-patterns


    【解决方案1】:

    我建议改变您的第一种方法,以避免将表示逻辑与域类混合。您可以将产品类型标识符添加到IProduct,并在包含产品类型标识符的特定方案之后为产品设置视图。在显示产品视图时,您在方案之后构建视图名称并集成产品类型标识符。

    这种方法的优点是您将遵循 convention-over-configuration 模式,不需要将产品类型映射到视图的显式配置。

    至于您的第二种方法:您可以添加一个包含分配给特定视图的视图的注册表,而不是在工厂中使用大型 switch 语句将域类映射到视图类型。这样可扩展性更好。

    这两种方法都存在表示逻辑不提供新域类视图的风险。您必须检查产品类型是否存在视图(或分别注册)才能正确处理。一种可能的方法是提供一个默认视图,该视图显示IProduct 中所有类的可用属性。此外,您应该为开发人员/管理员记录一条明确的错误消息(请参阅此link 以了解检查视图是否存在的方法)。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多