どのように私はXVALでリポジトリにアクセスする必要があるプロパティを検証していますか?

StackOverflow https://stackoverflow.com/questions/1892326

質問

私は、新しいユーザーの登録を検証するために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から切り離さ?維持し続けることができる方法上の任意のアイデア

役に立ちましたか?

解決

DDDはあなたがドメインの検証(不変施行)から抽象ユーザーレポにドメインサービスを持っているかもしれないことを示唆している。

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

私は何を示唆していることはあなたのUsers.Existsクエリを返すあなたの検証メソッド内のドメインサービスです。ような何かます:

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

の例では、私はレポ/データのアクセスするためのUserServiceに適切な依存関係を注入するDIを使用することになりますが、あなたが好きなら、あなたは工場やマニュアル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性を必要とする。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top