-1

私はasp.net mvc 3で作業しています。次のようなシナリオがあります:

  1. User モデルと Group モデルがあります。ユーザーは多くのグループを持つことができ、グループは多くのユーザーを持つことができます。したがって、これは多対多の関係です。
  2. UserController と GroupController があります。
  3. ユーザーは新しいグループを作成できます。
  4. リポジトリ パターンで説明されているように、UsersRepository と GroupsRepository があります。
  5. GroupController には Create(Group newGroup) アクションがあります。
  6. ユーザーは 10 個を超えるグループを持つことはできません。
  7. グループ名は一意である必要があります。

問題 1: 制限 6 を処理するには、User クラスに IValidatableObject を実装し、User が 10 個を超えるグループを持っている場合に検証エラーを生成する必要があります。ただし、GroupController の Create アクションは Group のみをパラメーターとして受け取るため、モデル バインダーは User.Validate() を呼び出すことはありません。

問題 2: 制限 7 を処理する唯一の方法は、グループ リポジトリに既に存在するすべてのグループに対して新しいグループ名を検証することです。したがって、この検証は GroupsRepository にある必要があります。私はそれについて正しいですか?

結局のところ、私は何か間違ったことをしているような気がします。私の質問は: 私のシナリオでは、既存のユーザーによる新しいグループの作成を実装する最良の方法は何ですか? UserGrougViewModel のようなビューモデルを作成し、それを GroupController の Create アクションに渡す必要がありますか? または、Create(Group newGroup) アクションをそのままにして、UserController に CreateGroup(User user) アクションを追加して、ルール 6 に対してユーザーを検証し、GroupController のアクション Create(Group newGroup) にリダイレクトする必要がありますか?

4

1 に答える 1

0

問題1:

IValidatableObject の実装については不明ですが、ユーザーが所属するグループの数を返すメソッドをユーザー リポジトリに作成できます。そして、GroupController の create メソッドからこの関数を呼び出します。このような:

ユーザーリポジトリ


public int GetNumberOfGroupsByUserId(int userId)
{
   return context.Users.SingleOrDefault(u=>u.Id==userId).Groups.Count;
}

新しいグループの作成中の GroupController からの使用

    UserRepository userRepo= new UserRepository();
    if(userRepo.GetNumberOfGroupsByUserId(id)>10)
    {
      //write code to send error message to view saying the user already has more than 10 groups
    }
else
{
 //go ahead and create new group
}

問題 2:

制限 7 を処理する唯一の方法は、グループ リポジトリに既に存在するすべてのグループに対して新しいグループ名を検証することです。したがって、この検証は GroupsRepository にある必要があります。私はそれについて正しいですか?

いいえ、検証は引き続き GroupController (またはビジネス層) で行うことができます。true問題 1 と同様に、グループ名がデータベースに既に存在する場合は返すメソッドを GroupRepository に作成し、そうでない場合は false を作成できます。このメソッドは、GroupRepository では次のようになります。

public bool NameExists(string groupName)
{
 int count=0;
count= context.Groups.Where(g=>g.Name==groupName).Count;
if (count==0)
return false;
else
return true;
}

新しいグループの作成中の GroupController からの使用

        GroupRepository groupRepo= new GroupRepository();
        if(groupRepo.NameExists(groupName))
        {
          //write code to send error message to view saying a group already exists with same name
        }
    else
    {
     //go ahead and create new group
    }
于 2012-09-20T23:36:13.110 に答える