【发布时间】:2009-09-15 07:50:02
【问题描述】:
这是“分析瘫痪”似乎已经站稳脚跟的场景之一,所以请指教!
项目
一个相当简单的汽车产品列表,其中包括零件参考、适合的车辆等详细信息。
前端是一个asp.net MVC应用程序。
后端是 SQL,使用 Subsonic 将产品投影到领域对象中。
功能
我们的屏幕之一是产品详细信息屏幕。一个 ASP.NET MVC 控制器调用产品存储库来检索产品详细信息,将这些详细信息(通过一些自动映射到 viewModel)返回到视图。
现在的杀手锏是我们有两个或三个频道进入网站,根据频道的不同,用户需要看到不同的零件编号。
例如,如果是零售渠道,则零件编号与数据库中的零件编号相同,但如果用户通过贸易渠道访问该站点,则零件参考的开头将替换为替代编号。
例如0900876 如果通过贸易频道查看,则变为 1700876。
我正在努力决定在哪里封装有关部件引用(以及其他可能改变的细节)的“通道规则”。
我已经考虑过这些替代方案。
将逻辑直接写入域对象中
在 Product 类中,我们可以有一个方法/属性来获取翻译后的部分参考。
public string TranslatedPartRef()
{
if (this.Channel == "Trade")
{
return PartRef.Replace("0900", "1700");
}
else
{
return PartRef;
}
}
在这种情况下,Product 实例必须知道通道,这对我来说似乎是错误的。
将逻辑封装在另一个对象中
我们可以编写一个类来处理这部分参考翻译,或者创建一个包含这个逻辑的Channel类。
我不明白的是如何协调这两个类。
如果控制器调用存储库来检索产品,那么它是否应该计算出使用的通道并翻译部件参考?如果是这样,我该如何将带有翻译后的部件参考的产品发送回视图?
同样值得注意的是,这部分引用也必须出现在搜索结果和其他场景中,因此我认为它需要整齐地包含在某个域中。
【问题讨论】:
标签: domain-driven-design business-logic