抽象リポジトリを使用してドメインオブジェクトをロードする永続性のないドメインモデルがあります。私のリポジトリ(データアクセス層(DAL))の具体的な実装では、エンティティフレームワークを使用してSQLサーバーデータベースからデータをフェッチします。データベースには、そのvarchar列の多くに長さの制約があります。ここで、次のドメインクラスがあると想像してください。
public class Case
{
public Case(int id, string text)
{
this.Id = id;
this.Text = text;
}
public int Id { get; private set; }
public string Text { get; set; }
}
そして、次のように定義された抽象リポジトリ:
public abstract class CaseRepository
{
public abstract void CreateCase(Case item);
public abstract Case GetCaseById(int id);
}
sqlserverのテーブルの[text]
列は次のように定義されますnvarchar(100)
ドメインクラス( )は永続性を無視していると述べましたが、エンティティフレームワークが例外をスローするため、具体的なリポジトリの実装では最終的に保存できないパラメータCase
の値を許可するのは間違っていると感じています。text
の割り当てtext
100文字を超える場合、エンティティフレームワークで生成されたクラスのプロパティ。そこで、ドメインモデルでこの制約をチェックすることにしました。これにより、データをDALに渡そうとする前にデータの有効性をチェックできるため、エラーレポートがドメインオブジェクトに対してより中心的になります。コンストラクターとプロパティセッターで制約を確認するだけでよいと主張できると思いますが、同じような制約を持つクラスが何百もあるので、問題を解決するためのより一般的な方法が必要でした。
さて、私が思いついたのは、ConstrainedString
次のように定義された、というクラスです。
public abstract class ConstrainedString
{
private string textValue;
public ConstrainedString(uint maxLength, string textValue)
{
if (textValue == null) throw new ArgumentNullException("textValue");
if (textValue.Length > maxLength)
throw new ArgumentException("textValue may not be longer than maxLength", "textValue");
this.textValue = textValue;
this.MaxLength = maxLength;
}
public uint MaxLength { get; private set; }
public string Value
{
get
{
return this.textValue;
}
set
{
if (value == null)
throw new ArgumentNullException("value");
if (value.Length > this.MaxLength) throw new ArgumentException("value cannot be longer than MaxLength", "value");
this.textValue = value;
}
}
}
ConstrainedString
さらに、私は呼び出されたの実装を持っていますString100
:
public class String100 : ConstrainedString
{
public String100(string textValue) : base(100, textValue) { }
}
したがって、その別の実装につながると、次のCase
ようになります。
public class Case
{
public Case(int id, String100 text)
{
this.Id = id;
this.Text = text;
}
public int Id { get; private set; }
public String100 Text { get; set; }
}
さて、私の質問は; いくつかの組み込みクラスまたは代わりに使用できる他のアプローチを見落としていますか?それとも、これは合理的なアプローチですか?
コメントや提案は大歓迎です。
前もって感謝します