私はビジネスメソッドを持つドメインモデルを構築しようとしており、EF 4.1で永続化を行っています。ここまでは順調ですね。EF 4.1では、DBSet <Something>ではなくDBSet <ISomething>を使用できますか?
問題は、すべてのプロパティが自分のドメインクラスでパブリックとして公開されていることです。とにかく私がチュートリアルから学んだことは少なくともそれです。つまり、ビジネスメソッド以外の不注意なプログラマによってクラスプロパティが変更されないという強力な証拠はありません。カプセル化が犯された。
私は何かを導入しようとしましたが、TableAttributeはインターフェイスではなくクラスにのみ適用されるため、EFにDBSetを実行させることはできません。私はクラスにTableAttributeを残すが、何かとにかく何かを実装する場合、EFがISomethingを知らないのでDBSet.Add()を実行できません。
私が考えることができる唯一の方法は、インターフェイスを使用するCRUDのEF 4.1の上に完全な抽象レイヤを書き込むことです。フードの下で、SomethingとIsomethingの間のタイプ変換を行います。 EFのデザインには、複雑さと大きな欠点がありました。または、私は何かを逃したに違いない。
どうすれば解決できますか?
多くのありがとうございます。
実際、私は2つの問題を私の質問で少し混乱させました。インターフェイスを使用するという考えは、私が読み取り専用インターフェイス(gettersのみ)とEFでサポートされている読み書きクラスを持つようなものです。 EFの上の薄い層がタイプを仲介します。しかし、依存するオブジェクトや物事を扱うときに共分散を素早く忍び寄ると、非常に素早く毛深くなります。 –
私はエンティティに直接検証ロジックを持っています。実際、私のビジネスメソッドは、古典的なOOごとにエンティティ上にあります。 PersonにはName、Age、Mood、CalculateMood()があります。私は彼の気分が悪くなるだろう十代のインスタンスがあると仮定。 * CalculateMood()の後で不注意なプログラマーがAge = 35 *を変更した場合、EFはデータベース内でage = 35とmood = Badに更新します。それは私が防止したいと思う破損です。 –
PersonをロードするビジネスメソッドクラスMoodHandlerを暗示している場合、Person.Ageを読み込み、Person.Mood = "Bad"と設定すると、問題は次のようになります。1)ドメインモデルは貧血です(Fowler、2003 )2)Person.Mood = "Bad"を設定した後も、不注意なプログラマがPerson.Age = 35を変更することを防ぐことはできません。クラス全体の多くのビジネスメソッドは、トランザクション内で同じPersonインスタンスを使用するため、ネットエフェクトは予測や理由の説明が難しく、単体テストテストはできません。 –