3

良いリポジトリ/ IoCデザインを保つために、私は現在の問題を解決する最善の方法を見つけようとしています。適切なリポジトリデザイン、あるオブジェクトを別のオブジェクトに結びつける

MemberCharacterの2つのオブジェクトがあります。

基本的に、1つのメンバーは多くの文字を持つことができます。十分に簡単です。

Member 
{ 
IList<Character> Characters { get; set; } 
} 

IMemberRepository ...

interface IMemberRepository 
{ 
MemberCreateStatus CreateMember(string email, string password); 
bool ValidateMember(string email, string password); 
bool ChangePassword(string email, string password, string newPassword); 
void RecoverPassword(string email); 
} 

がありそしてICharacterRepository

interface ICharacterRepository 
{ 
Character CreateCharacter(string name); 
} 

はそれでは、私の質問は非常に簡単ですがあります。論理を追加してをMemberに追加する場所を教えてください。 IMemberRepositoryでこれを行いますか?それは私にとって面倒なようです。それはIMemberRepositoryの仕事の範囲を超えているようです。 ICharacterRepositoryに追加しますか?メンバーシップの知識を分かち合うことに違反しているように見えるので、それも私にはちょっと変わったようです。何が最善の取り組みですか、ここですか?

これだけの方法であれば、それほど大きな問題ではありませんが、2つのクラスの間には他にも多くのことが起こります。お互いに関連する2つのオブジェクトのこの状況にアプローチするための「標準」の方法は何ですか?私はこれをASP.NET MVCでコーディングしています。

答えて

4

私はあなたが多分リポジトリに意図したものと多少接近していると思います。あなたの混乱の原因かもしれません。

リポジトリは、一連のデータに収集セマンティクスを提供することです。つまり、リポジトリは取得、追加、削除を意味します。彼らは検証しません。彼らは個々のアイテムについて物事を変えない。最近は多くの人がリポジトリの名前を付けてDAOのように見せているようですが、データアクセスオブジェクト(DAO)ではありません。

メンバーには、文字のリストが含まれています。すばらしいです!メンバーにキャラクターを追加したいですか?を正確ににしてください。 Member.AddCharacter(...)またはMember.Characters.Add(...)。私は通常、前者を使用しますが、後者も同様に機能します(しかしカスタムコレクションの実装が必要です)。

+0

私のリポジトリは、データベースアクセスを必要とするので、1 validateMemberを行います。私のモデルに縛られていません。なぜAdd(T)メソッドを使うにはカスタムコレクションの実装が必要なのでしょうか? – Ciel

+0

さて、あなたが言っているものを手に入れていますが、これは今私がもっと混乱しています。データストアからデータを取り出さなければならないもっと複雑なロジックを置くことになっているのはどこですか?私はリポジトリが私がデータにアクセスした場所だと思ったので、ビジネス層とUI層はデータ層の知識を持っていませんでした。 – Ciel

+0

あなたのリポジトリはメンバー自体を検証しません。データベースから 'Member'データを取得し、それをビジネス層に返します。ビジネス層は、パスワードが正しいことを検証します(または、レポジトリによってレコードが返されたことを確認します)。 – KallDrexx

0

私にとって最も自然なアプローチは、メンバーオブジェクトが独自の文字を追跡する責任があるため、そのロジックをMemberクラス内に配置することです。

あなたはどう思いますか?

+0

SoMos - 私の意見では、これは最も柔軟な方法ではありません。私はそのアプローチにつながる最も抵抗の少ない経路を見ることができます。ただし、基本的な保存/取得のための汎用Tリポジトリと同様に、メンバプロパティの基になるインターフェイスを持つ必要があります。与えられたクラスエンティティの標準以外の何かを行う一般的に型付けされた 'サービスまたはタスク'クラスを作成します。それはとにかく私の煮詰めたアプローチです... –

1

CharactersMemberを入力することは、IMemberRepositoryの責任であると感じます。いくつかの理由があります。

  • IMemberRepositoryMemberタイプのRepositoryあるので、それはMemberが構成されているものを知っています。そしてそれがCharacterタイプを知っている理由です。
  • 確かにICharacterRepositoryさんの責任ではありません。 Characterタイプを使用して、将来他のタイプを組み立てることができます。新しいタイプを追加するたびにCharacterRepositoryに影響します。
  • IMemberRepository を使用してCharacterオブジェクトをMemberに取り込みます。
関連する問題