Пример #1
0
 public static Cloud SetHooks(this Cloud cloud)
 {
     cloud.BeforeSave("Todo", todo =>
     {
         var title = todo.Get<string>("title");
         // reset value for title
         if (!string.IsNullOrEmpty(title))
             if (title.Length > 20) todo["title"] = title.Substring(0, 20);
         // returning any value will be ok.
         return Task.FromResult(true);
     }).BeforeSave("Review", review =>
     {
         var comment = review.Get<string>("comment");
         if (comment.Length > 140) review["comment"] = comment.Substring(0, 137) + "...";
         return Task.FromResult(comment);
     }).AfterSave("Review", async review =>
     {
         var post = review.Get<AVObject>("post");
         await post.FetchAsync();
         post.Increment("comments");
         await post.SaveAsync();
     }).AfterSave("_User", async user =>
     {
         if (user is AVUser avUser)
         {
             avUser.Set("from", "LeanCloud");
             await avUser.SaveAsync();
         }
     }).BeforeUpdate("Review", (EngineObjectHookContext context) =>
     {
         if (context.UpdatedKeys.Contains("comment"))
         {
             var comment = context.TheObject.Get<string>("comment");
             if (comment.Length > 140) throw new EngineException(400, "comment 长度不得超过 140 字符");
         }
         return Task.FromResult(true);
     }).AfterSave("Article", article =>
     {
         Console.WriteLine(article.ObjectId);
         return Task.FromResult(true);
     }).BeforeDelete("Album", async album =>
     {
         AVQuery<AVObject> query = new AVQuery<AVObject>("Photo");
         query.WhereEqualTo("album", album);
         int count = await query.CountAsync();
         if (count > 0)
         {
             throw new Exception("无法删除非空相簿");
         }
         else
         {
             Console.WriteLine("deleted.");
         }
     }).AfterDelete("Album", async album =>
     {
         AVQuery<AVObject> query = new AVQuery<AVObject>("Photo");
         query.WhereEqualTo("album", album);
         var result = await query.FindAsync();
         if (result != null && result.Count() != 0)
         {
             await AVObject.DeleteAllAsync(result);
         }
     }).OnVerifiedSMS((AVUser user) =>
     {
         Console.WriteLine("user verified by sms");
         return Task.FromResult(true);
     }).OnLogIn((AVUser user) =>
     {
         Console.WriteLine("user logged in.");
         return Task.FromResult(true);
     });
     return cloud;
 }
Пример #2
0
        public static void UseLambda(this Cloud cloud)
        {
            // case 1. use EngineObjectHookContext
            cloud.UseHook("Todo", EngineHookType.BeforeSave, (context) =>
            {
                var todo = context.TheObject;
                var by   = context.By;
                return(Task.FromResult(context.TheObject));
            });

            cloud.BeforeSave("Todo", (context) =>
            {
                return(Task.FromResult(context.TheObject));
            });

            // case 2. use TheObject
            cloud.UseHook("Todo", EngineHookType.BeforeSave, (AVObject todoObj) =>
            {
                return(Task.FromResult(todoObj));
            });

            cloud.BeforeSave("Todo", (AVObject todoObj) =>
            {
                return(Task.FromResult(todoObj));
            });

            // case 3. use TheObject and user
            cloud.UseHook("Todo", EngineHookType.BeforeSave, (AVObject todoObj, AVUser by) =>
            {
                return(Task.FromResult(todoObj));
            });

            cloud.BeforeSave("Todo", (AVObject todoObj, AVUser by) =>
            {
                return(Task.FromResult(todoObj));
            });

            // case 3. use sub-class
            AVObject.RegisterSubclass <Todo>();

            cloud.UseHook <Todo>(EngineHookType.BeforeSave, (Todo theTodoObj) =>
            {
                // theTodoObj is an Todo instance.
                return(Task.FromResult(theTodoObj));
            });

            cloud.UseHook <Todo>(EngineHookType.BeforeSave, (Todo theTodoObj, AVUser by) =>
            {
                return(Task.FromResult(theTodoObj));
            });

            cloud.BeforeSave <Todo>((todo) =>
            {
                // todo is an Todo instance.
                return(Task.FromResult(todo));
            });

            cloud.BeforeSave <Todo>((todo, by) =>
            {
                // todo is an Todo instance.
                return(Task.FromResult(todo));
            });

            cloud.BeforeUpdate("Todo", review =>
            {
                var updatedKeys = review.GetUpdatedKeys();
                if (updatedKeys.Contains("comment"))
                {
                    var comment = review.Get <string>("comment");
                    if (comment.Length > 140)
                    {
                        throw new EngineException(400, "comment 长度不得超过 140 字符");
                    }
                }
                return(Task.FromResult(true));
            });

            EngineHookDelegateSynchronous afterPostHook = (post) =>
            {
            };

            cloud.AfterSave("Post", (EngineObjectHookDeltegateSynchronous)(async post =>
            {
                // 直接修改并保存对象不会再次触发 after update hook 函数
                post["foo"] = "bar";
                await post.SaveAsync();
                // 如果有 FetchAsync 操作,则需要在新获得的对象上调用相关的 disable 方法
                // 来确保不会再次触发 Hook 函数
                await post.FetchAsync();
                post.DisableAfterHook();
                post["foo"] = "bar";

                // 如果是其他方式构建对象,则需要在新构建的对象上调用相关的 disable 方法
                // 来确保不会再次触发 Hook 函数
                post = AVObject.CreateWithoutData <AVObject>(post.ObjectId);
                post.DisableAfterHook();
                await post.SaveAsync();
            }));
        }
 public static Cloud SetHooks(this Cloud cloud)
 {
     cloud.BeforeSave("Todo", SampleHooks.Singleton.CheckTitle);
     cloud.UseHookClass <TodoHook>();
     return(cloud);
 }