次のビジネスエンティティクラスについて考えてみます。自分自身を検証するには、おそらく何らかの競合を防ぐために、データベースの状態について何かを知る必要があります。したがって、このデータを取得するために、データアクセス層に依存します。
状態をカプセル化し、状態を検証し、データストアにアクセスしてそうするクラスを持つことは、単一責任原則の違反ですか?
class MyBusinessObject
{
private readonly IDataStore DataStore;
public MyBusinessObject(IDataStore dataStore)
{
this.DataStore = dataStore;
}
public virtual int? Id { get; protected set; }
public virtual string Name { get; set; }
// ... Other properties...
public IEnumerable<ValidationResult> Validate()
{
var data = this.DataStore.GetDataThatInfluencesValidation();
return this.ValidateUsing(data);
}
// ... ValidateUsing method would be in here somewhere ...
}
それは私にとって赤い旗を投げています:
- ASP.NET MVCコントローラーのCreateメソッドのコンテキストでは、新しいインスタンスを作成して、検証する意図なしにView()メソッドに渡す可能性があります。それでは、なぜIDataStoreを渡す必要があるのでしょうか。
- 私はNHibernateを使用しています(そして私は初心者です)。NHがエンティティを作成するたびに依存関係を挿入するIInterceptorを作成する必要があるようです。たぶんそれでいいのですが、少し違和感があります。
NHibernateが使用するのに貧血/DTOタイプのオブジェクトを使用し、それをすべてのビジネスルールを知っていて、データストアに依存している場合はデータストアにアクセスできる何かにラップする必要があると考え始めています。質問とタイトルを入力したので、StackOverflowはいくつかの興味深いリソースを提案しました:こことここ。
私の質問もこれと非常によく似ていますが、私の状況により近い別の方法で質問したいと思いました。