私は2つの方法で「送料見積もり」を表すことができるシステムで働いています。
- 特定の日付:アイテムはその日付で出荷されることが保証されています
- 日間隔:アイテムは今日から「X to Y」日で発送されます
モデルに関する情報は、意味的には同じで、「発送予定」です。配送見積もりの情報をシステムから取得すると、見積もりが最初の形式か2番目の形式かがわかります。
このための現在のモデルは次のようになります。
class EstimattedShippingDateDetails
{
DateTime? EstimattedShippingDate {get; set;}
Range? EstimattedShippingDayRange {get; set;}
}
Range
整数の「始まり->終わり」をラップする単純なクラスです。
struct Range
{
int Start {get; set}
int End {get; set}
public override ToString()
{
return String.Format("{0} - {1}", Start, End);
}
}
推定モデルのプロパティの1つだけが入力されるため、このアプローチは好きではありません。一方のプロパティでnullをテストし、もう一方のプロパティにデータがあると仮定する必要があります。
各プロパティは、ユーザーには異なる方法で表示されますが、現在のスイッチングロジックが存在するカスタムMVC DisplayTemplateを使用して、UIの同じ場所に表示されます。
@Model EstimattedShippingDateDetails
@if (Model.EstimattedShippingDate.HasValue)
{
Html.DisplayFor(m => Model.EstimattedShippingDate)
}
else
{
Html.DisplayFor(m => Model.EstimattedShippingDayRange)
}
MVCアプリケーションで表示ロジックをシンプルに保ちながら、これを実際の要件をよりよく表すようにモデル化するにはどうすればよいですか?
インターフェースと、推定の「タイプ」ごとに1つずつ、2つの実装を使用することを考えましたが、両方の共通インターフェースに頭を抱えているようには見えません。メンバーなしでインターフェースを作成すると、統一された方法でデータにアクセスできなくなり、設計が良くありません。また、viewmodelをできるだけシンプルにしたかったのです。ただし、このアプローチでは「構築による修正」コードが得られます。これは、null値を設定する必要がないためです。各実装には、n DateTime
またはnullを設定できないプロパティがありますRange
。
私はまた、単一の使用と考えRange
、状況#1が発生したときに、ちょうど同じを使用してDateTime
両方のためにStart
とEnd
、私はそれは、静的または間隔によってだかどうかを検出しなければならないとして、これはUIに値を放出する方法についての合併症を追加しますが値を比較し、範囲を単一の日付またはフォーマットされた間隔として表示されるように適切にフォーマットします。
私が必要としているのは、Typescriptの共用体に似た概念です。基本的には、2つの型のいずれかになるプロパティです。もちろん、C#にはネイティブにそのようなものは存在しません(dynamic
それに近いだけです)。