13

私は、RavenDB を使用するアプリケーション フレームワークを動かそうとしています。セッションと 1 対 1 の関係を持ち、効果的に作業単位の抽象化になるビジネス ロジック サービスをセットアップしました。

ビジネス ロジック サービスの一部には、すべての検証が含まれます。サービスからのメソッドは次のようなものかもしれません

    public void StoreUser(User user)
    {
        //Some validation logic
        if(string.IsNullOrWhiteSpace(user.Name))
            throw new Exception("User name can not be empty");

        Session.Store(user);
    }

問題は、ユーザーが保存されるとすぐに追跡されるため、store メソッドの検証をバイパスできますが、正しい値を保存して後で変更できることです。

    public void TestUserStore()
    {
        var u1 = new User() {Name = "John"};
        var u2 = new User() { Name = "Amy" };

        Service.StoreUser(u1);
        u1.Name = null; //change is tracked and will persist on the next save changes
        Service.StoreUser(u2);
        Service.SaveChanges();

        //The following fails, as we have stored null as the name rather than "John" bypassing our validation
        Assert.IsTrue(Service.AdhocQuery<User>().Any(u => u.Name == "John"));

    }

保存されたアイテムのスナップショットのみを保存し、それ以上の変更を追跡しないように RavenDB を取得する方法はありますか? 違法な更新を防ぐために、ビジネス ロジック サービスに出入りするすべてのものを複製する必要がありますか? または、間違った場所で検証を行っていますか?このロジックを配置するより良い場所はありますか?

4

1 に答える 1

12

すべての保存の前に検証ロジックを内部に配置するIDocumentStoreListenerと、この種のチェックを自動的に行うことができます。

この問題については、こちらのブログで詳しく説明しています。

于 2012-10-03T06:40:08.397 に答える