系统有一个页面,用户可以在其中通过指定开始日期和结束日期来搜索项目。这些是普通日期(没有时间部分)。对于用户来说,包含结束日期似乎是最直观的(因此也包括该结束日期的所有项目)。
然而CreateDate
,这些项目在数据存储中确实包含时间组件。实际上,这意味着我们需要将这个永恒的结束日期转换为第二天的 0:00:00 小时日期。这样我们就可以编写如下查询:
SELECT *
FROM Items
WHERE CreateDate >= @STARTDATE
AND CreateDate < @ENDDATE
转换此结束日期就像编写这行代码一样简单:
endDate.Date.AddDays(1);
诺我的问题是:
我应该考虑这最后一行代码业务逻辑并将其放在业务层中,还是应该将这一行视为“模型绑定逻辑”并应放在表示层中?
当它被放置在 BL 中时,这意味着 BL 知道表示层,因为提供值的方式是特定于接口的。另一方面,由于操作被定义为业务层中的 DTO,我也可以将此对象视为接口,应该方便表示层。
这个问题在本质上甚至可能是哲学问题,因为可能有多种方式来看待这个问题,而实际的转换代码是微不足道的。我很想听听您为什么认为它应该放在一层而不是另一层。
我不希望应用程序的架构会对这个问题的答案产生任何影响。但为了给出更完整的画面,该架构基于命令和查询,表示层创建了一个由业务层处理的查询对象。PL 代码通常如下所示:
public Action Filter(DateTime start, DateTime end)
{
var query = new GetItemsByStartEndEndDateQuery
{
StartDate = start.Date,
EndDate = end.Date.AddDays(1)
}
var items = this.queryProcessor.Handle(query);
return this.View(items);
}
或者在可能的情况下,使用(MVC)模型绑定来简单地模型绑定命令和查询对象(非常方便):
public Action Filter(GetItemsByStartEndEndDateQuery query)
{
var items = this.queryProcessor.Handle(query);
return this.View(items);
}
当涉及多个用户(例如,WCF 层和 MVC 层)时,您的答案会改变吗?