【问题标题】:Correct architecture for presentation objects that implement same interface实现相同接口的表示对象的正确架构
【发布时间】:2014-04-24 18:08:55
【问题描述】:
在我的项目的域模型中,我有大量的类实现相同的接口 IProduct:电话、平板电脑、DataPackage、附件等。
我希望此产品的不同组合显示在不同的产品列表页面上。这意味着,我从域层获得了表示层中的列表。现在,我想知道为每个接口实现绑定不同视图的正确方法是什么?
我看到了两种方法:
- 在 IProduct 接口中有一个属性\方法,用于定义需要显示产品时将选择的视图。一方面,它有助于将显示逻辑封装到类中,并为每个产品调用类似 product.Display() 的方法。另一方面,这会导致在域模型中添加一些显示逻辑,这在我看来并不好。
- 在表示层中有一个工厂,可以分析产品的类型并绑定正确的表示。
哪一个更可取?也许有更多的模式可以做到这一点?
【问题讨论】:
标签:
c#
asp.net-mvc
design-patterns
【解决方案1】:
我建议改变您的第一种方法,以避免将表示逻辑与域类混合。您可以将产品类型标识符添加到IProduct,并在包含产品类型标识符的特定方案之后为产品设置视图。在显示产品视图时,您在方案之后构建视图名称并集成产品类型标识符。
这种方法的优点是您将遵循 convention-over-configuration 模式,不需要将产品类型映射到视图的显式配置。
至于您的第二种方法:您可以添加一个包含分配给特定视图的视图的注册表,而不是在工厂中使用大型 switch 语句将域类映射到视图类型。这样可扩展性更好。
这两种方法都存在表示逻辑不提供新域类视图的风险。您必须检查产品类型是否存在视图(或分别注册)才能正确处理。一种可能的方法是提供一个默认视图,该视图显示IProduct 中所有类的可用属性。此外,您应该为开发人员/管理员记录一条明确的错误消息(请参阅此link 以了解检查视图是否存在的方法)。