ドメイン駆動設計の原則を使用して、ASP.NETMVCアプリの書き直しに取り組んでいます。ユーザーエンティティを検証しようとしています。これまでのところ、基本的なルールを検証することができます(ユーザー名とパスワードがnull /空白以外の文字列であるなど)。ただし、ルールの1つとして、ユーザー名が一意であることを確認する必要があります。ただし、これを行うにはデータベースにアクセスする必要があります。つまり、IUserRepositoryをそのようにUserエンティティに挿入する必要があります。
public class User
{
private readonly IUserRepository _userRepository;
public User(IUserRepository repo)
{
_userRepository = repo;
}
public override void Validate()
{
//Basic validation code
if (string.IsNullOrEmpty(Username))
throw new ValidationException("Username can not be a null or whitespace characters");
if (string.IsNullOrEmpty(Password))
throw new ValidationException("Password can not be a null or whitespace characters");
//Complex validation code
var user = _userRepository.GetUserByUsername(Username);
if (user != null && user.id != id)
throw new ValidationException("Username must be unique")
}
}
しかし、これは...よく間違っているようです。私のエンティティを私のリポジトリに依存させることは悪い考えのようです(私が間違っている場合は私を訂正してください)。ただし、エンティティに検証コードを含めることは理にかなっています。複雑な検証コードを配置するのに最適な場所はどこですか?