2

xVal を使用して、新しいユーザーの登録を検証しようとしています。新しいユーザーが登録しようとしているユーザー名が既に使用されているかどうかを確認するロジックを実装しようとしたときに、バズソーに遭遇しました。User エンティティを UsersRepository に依存させずに、これを達成する方法を見つけることができないようです。ユーザーエンティティに実装する方法を見つけるために必要なメソッドは次のとおりです。

public IEnumerable<ErrorInfo> ValidateUniqueUserName(string username)
{
    if(usersRepository.Users.Exists(m => (m.UserName == username)))
        yield return new ErrorInfo("UserName", "User name already exists");
}

このシナリオで xVal を引き続き使用し、User エンティティを UsersRepository から切り離す方法についてのアイデアはありますか?

4

1 に答える 1

2

DDD は、ドメイン検証からユーザー リポジトリを抽象化するためのドメイン サービスを用意することをお勧めします (不変の強制)。

上記の例のコードがどこにあるのか知りたいです (検証サービス)? ただし、それがドメイン内にあることを確認することをお勧めします。インターフェイスをサポートしているエンティティに複雑な検証を適用する賢い方法IDataErrorInfoを次に示します。

私がお勧めするのは、Users.Existsクエリを返す検証メソッド内のドメイン サービスです。何かのようなもの:

        base.AddRule(new ValidationRule()
        {
            Properties = "username",
            Description = "User name already exists",
            validator = () => !(new UserService()).Users.Exists(m => (m.UserName == username))
        });

上記の例では、リポジトリ/データにアクセスするために DI を使用して適切な依存関係を挿入しますが、必要に応じてUserServiceファクトリまたは手動の DI オブジェクト作成方法を使用できます。

        base.AddRule(new ValidationRule()
        {
            Properties = "username",
            Description = "User name already exists",
            validator = () =>
                {
                    UserService us = ObjectFactory.GetInstance<UserService>();
                    return !us.Users.Exists(m => (m.UserName == username));
                }
        });

注:上記のメソッドでは、無効な状態を示すためにvalidatorプロパティを に設定する必要があります (明確でない場合)。false

于 2009-12-12T06:44:32.233 に答える