私が正しく理解していれば、CQRSは書き込みと読み取りの責任分担についてです。だから私は書き込みモデルでリポジトリを使うことができます。たとえば、var user = repository.GetUserById();
- これはidでユーザーを取得し、repository.UpdateUser(user);
は変更されたプロパティでユーザーを更新します。読み取りモデルでは、より複雑なDTOのを構築することができます。リポジトリでCQRSを使用する
public class UsersReadModel
{
private IMyContext context;
public UsersReadModel(IMyContext context)
{
this.context = context;
}
public ComplexUserDTO GetComplexUser(ISelectQuery query)
{
ComplexUserDTO user = new ComplexUserDTO();
// get all user properties, GetUser by id
user.UserDTO = context.Users.Where(d => d.UserId == query.UserId).ProjectTo<UserDTO>().FirstOrDefault();
//here I don't need everything from PoliciesTable, I just need two columns, so I use anonymous object
var policieObject = context.Policies.Where(f => f.BasePolicyId == query.PolicyId).Select(s => new { s.PoliciesNames, s.Clients.Select(d => d.ClientNames).ToList() }).FirstOrDefault();
user.PoliciesNames = policieObject.PoliciesNames;
user.ClientsNames = policieObject.ClientsNames;
return user;
}
}
私はDTOにマッピングする必要がある、と私の読み取りモデルではありませんので、だから私の書き込みモデルでは、私は、私のリポジトリからIDでユーザーを取得します私はIDでGetUserを使用しますが、私はそれを必要とするので、DTOにマップします。このコードを繰り返すのではないですか?(私はIDでユーザーを取得したい場合、両方の場所で変更する必要があります)私の読み込みモデルでリポジトリを使用することはできますか?この場合、私はUsersReadModel
のリポジトリとコンテキストの両方を使用しなければなりません(匿名オブジェクトとテーブル列の一部を選択する)。