システムには、ユーザーが開始日と終了日を指定してアイテムを検索できるページがあります。これらは単純な日付です(時間コンポーネントなし)。ユーザーにとっては、終了日が包括的であることが最も直感的であるように思われます(したがって、その終了日のすべての項目も含めてください)。
ただし、の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レイヤー)、答えは変わりますか?