瀏覽代碼

Lucene事务保证

懒得勤快 6 年之前
父節點
當前提交
79794ed9c3

+ 1 - 0
src/Masuit.MyBlogs.Core/Controllers/BugController.cs

@@ -45,6 +45,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="issueService"></param>
         /// <param name="messageService"></param>
         /// <param name="hostingEnvironment"></param>
+        /// <param name="searchEngine"></param>
         public BugController(IIssueService issueService, IInternalMessageService messageService, IHostingEnvironment hostingEnvironment, ISearchEngine<DataContext> searchEngine)
         {
             IssueService = issueService;

+ 10 - 22
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -43,8 +43,6 @@ namespace Masuit.MyBlogs.Core.Controllers
 
         private readonly IHostingEnvironment _hostingEnvironment;
         private readonly ISearchEngine<DataContext> _searchEngine;
-        private readonly ILuceneIndexer _luceneIndexer;
-        private readonly ILuceneIndexSearcher _luceneIndexSearcher;
 
         /// <summary>
         /// 
@@ -61,9 +59,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="postHistoryVersionService"></param>
         /// <param name="hostingEnvironment"></param>
         /// <param name="searchEngine"></param>
-        /// <param name="luceneIndexer"></param>
-        /// <param name="luceneIndexSearcher"></param>
-        public PostController(IPostService postService, ICategoryService categoryService, IBroadcastService broadcastService, ISeminarService seminarService, IPostHistoryVersionService postHistoryVersionService, IHostingEnvironment hostingEnvironment, ISearchEngine<DataContext> searchEngine, ILuceneIndexer luceneIndexer, ILuceneIndexSearcher luceneIndexSearcher)
+        public PostController(IPostService postService, ICategoryService categoryService, IBroadcastService broadcastService, ISeminarService seminarService, IPostHistoryVersionService postHistoryVersionService, IHostingEnvironment hostingEnvironment, ISearchEngine<DataContext> searchEngine)
         {
             PostService = postService;
             CategoryService = categoryService;
@@ -72,8 +68,6 @@ namespace Masuit.MyBlogs.Core.Controllers
             PostHistoryVersionService = postHistoryVersionService;
             _hostingEnvironment = hostingEnvironment;
             _searchEngine = searchEngine;
-            _luceneIndexer = luceneIndexer;
-            _luceneIndexSearcher = luceneIndexSearcher;
         }
 
         /// <summary>
@@ -95,7 +89,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 ViewBag.Prev = PostService.GetFirstEntityNoTracking(p => p.ModifyDate < modifyDate && (p.Status == Status.Pended || user.IsAdmin), p => p.ModifyDate, false);
                 if (!string.IsNullOrEmpty(kw))
                 {
-                    ViewData["keywords"] = _luceneIndexSearcher.CutKeywords(kw).ToJsonString();
+                    ViewData["keywords"] = post.Content.Contains(kw) ? $"['{kw}']" : _searchEngine.LuceneIndexSearcher.CutKeywords(kw).ToJsonString();
                 }
                 if (user.IsAdmin)
                 {
@@ -221,8 +215,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             {
                 HttpContext.Session.Set("post-vote" + id, id);
                 ++post.VoteDownCount;
-                PostService.UpdateEntity(post);
-                bool b = PostService.SaveChanges() > 0;
+                bool b = PostService.UpdateEntitySaved(post);
                 return ResultData(null, b, b ? "投票成功!" : "投票失败!");
             }
 
@@ -477,8 +470,7 @@ namespace Masuit.MyBlogs.Core.Controllers
             post.Status = Status.Pended;
             post.ModifyDate = DateTime.Now;
             post.PostDate = DateTime.Now;
-            PostService.UpdateEntity(post);
-            bool b = _searchEngine.SaveChanges() > 0;
+            bool b = PostService.UpdateEntitySaved(post);
             if (!b)
             {
                 return ResultData(null, false, "审核失败!");
@@ -515,8 +507,8 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var post = PostService.GetById(id);
             post.Status = Status.Deleted;
-            PostService.UpdateEntity(post);
-            bool b = _searchEngine.SaveChanges() > 0;
+            bool b = PostService.UpdateEntitySaved(post);
+            _searchEngine.LuceneIndexer.Delete(post);
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
 
@@ -530,8 +522,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         {
             var post = PostService.GetById(id);
             post.Status = Status.Pended;
-            PostService.UpdateEntity(post);
-            bool b = _searchEngine.SaveChanges() > 0;
+            bool b = PostService.UpdateEntitySaved(post);
             return ResultData(null, b, b ? "恢复成功!" : "恢复失败!");
         }
 
@@ -576,8 +567,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 }
             }
 
-            PostService.DeleteById(id);
-            bool b = _searchEngine.SaveChanges() > 0;
+            bool b = PostService.DeleteByIdSaved(id);
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }
 
@@ -827,8 +817,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 });
             }
 
-            PostService.UpdateEntity(p);
-            bool b = _searchEngine.SaveChanges() > 0;
+            bool b = PostService.UpdateEntitySaved(p);
             if (b)
             {
 #if !DEBUG
@@ -943,8 +932,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                 return ResultData(null, false, "如果要定时发布,请选择正确的一个将来时间点!");
             }
 
-            PostService.AddEntity(p);
-            bool b = _searchEngine.SaveChanges() > 0;
+            bool b = PostService.AddEntitySaved(p) != null;
             if (b)
             {
                 if ("false" == CommonHelper.SystemSettings["DisabledEmailBroadcast"])

+ 141 - 13
src/Masuit.MyBlogs.Core/Infrastructure/Services/PostService.cs

@@ -9,7 +9,10 @@ using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using PanGu;
 using PanGu.HighLight;
+using System;
+using System.Collections.Generic;
 using System.Linq;
+using System.Linq.Expressions;
 using System.Threading.Tasks;
 
 namespace Masuit.MyBlogs.Core.Infrastructure.Services
@@ -62,33 +65,158 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Services
         }
 
         /// <summary>
-        /// 统一保存的方法
+        /// 添加实体并保存
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Post AddEntitySaved(Post t)
+        {
+            t = base.AddEntity(t);
+            _searchEngine.SaveChanges(t.Status == Status.Pended);
+            return t;
+        }
+
+        /// <summary>
+        /// 添加实体并保存(异步)
+        /// </summary>
+        /// <param name="t">需要添加的实体</param>
+        /// <returns>添加成功</returns>
+        public override Task<int> AddEntitySavedAsync(Post t)
+        {
+            base.AddEntity(t);
+            return _searchEngine.SaveChangesAsync(t.Status == Status.Pended);
+        }
+
+        /// <summary>
+        /// 根据ID删除实体并保存
+        /// </summary>
+        /// <param name="id">实体id</param>
+        /// <returns>删除成功</returns>
+        public override bool DeleteByIdSaved(object id)
+        {
+            base.DeleteById(id);
+            return _searchEngine.SaveChanges() > 0;
+        }
+
+        /// <summary>
+        /// 删除多个实体并保存
+        /// </summary>
+        /// <param name="list">实体集合</param>
+        /// <returns>删除成功</returns>
+        public override bool DeleteEntitiesSaved(IEnumerable<Post> list)
+        {
+            base.DeleteEntities(list);
+            return _searchEngine.SaveChanges() > 0;
+        }
+
+        /// <summary>
+        /// 根据ID删除实体并保存(异步)
+        /// </summary>
+        /// <param name="id">实体id</param>
+        /// <returns>删除成功</returns>
+        public override Task<int> DeleteByIdSavedAsync(object id)
+        {
+            base.DeleteById(id);
+            return _searchEngine.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 删除多个实体并保存(异步)
+        /// </summary>
+        /// <param name="list">实体集合</param>
+        /// <returns>删除成功</returns>
+        public override Task<int> DeleteEntitiesSavedAsync(IEnumerable<Post> list)
+        {
+            base.DeleteEntities(list);
+            return _searchEngine.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 根据条件删除实体
         /// </summary>
-        /// <returns>受影响的行数</returns>
-        public override int SaveChanges()
+        /// <param name="where">查询条件</param>
+        /// <returns>删除成功</returns>
+        public override int DeleteEntitySaved(Expression<Func<Post, bool>> @where)
         {
+            base.DeleteEntity(@where);
             return _searchEngine.SaveChanges();
         }
 
         /// <summary>
-        /// 统一保存数据
+        /// 删除实体并保存
         /// </summary>
-        /// <returns>受影响的行数</returns>
-        public override Task<int> SaveChangesAsync()
+        /// <param name="t">需要删除的实体</param>
+        /// <returns>删除成功</returns>
+        public override bool DeleteEntitySaved(Post t)
         {
+            base.DeleteEntity(t);
+            return _searchEngine.SaveChanges() > 0;
+        }
+
+        /// <summary>
+        /// 根据条件删除实体
+        /// </summary>
+        /// <param name="where">查询条件</param>
+        /// <returns>删除成功</returns>
+        public override Task<int> DeleteEntitySavedAsync(Expression<Func<Post, bool>> @where)
+        {
+            base.DeleteEntity(@where);
             return _searchEngine.SaveChangesAsync();
         }
 
         /// <summary>
-        /// 添加实体并保存
+        /// 删除实体并保存(异步)
         /// </summary>
-        /// <param name="t">需要添加的实体</param>
-        /// <returns>添加成功</returns>
-        public override Post AddEntitySaved(Post t)
+        /// <param name="t">需要删除的实体</param>
+        /// <returns>删除成功</returns>
+        public override Task<int> DeleteEntitySavedAsync(Post t)
+        {
+            base.DeleteEntity(t);
+            return _searchEngine.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 更新实体并保存
+        /// </summary>
+        /// <param name="t">更新后的实体</param>
+        /// <returns>更新成功</returns>
+        public override bool UpdateEntitySaved(Post t)
         {
-            var p = base.AddEntity(t);
-            bool b = _searchEngine.SaveChanges() > 0;
-            return b ? p : default(Post);
+            base.UpdateEntity(t);
+            return _searchEngine.SaveChanges() > 0;
+        }
+
+        /// <summary>
+        /// 更新多个实体并保存
+        /// </summary>
+        /// <param name="list">实体集合</param>
+        /// <returns>更新成功</returns>
+        public override bool UpdateEntitiesSaved(IEnumerable<Post> list)
+        {
+            base.UpdateEntities(list);
+            return _searchEngine.SaveChanges() > 0;
+        }
+
+        /// <summary>
+        /// 更新多个实体并保存(异步)
+        /// </summary>
+        /// <param name="list">实体集合</param>
+        /// <returns>更新成功</returns>
+        public override Task<int> UpdateEntitiesSavedAsync(IEnumerable<Post> list)
+        {
+            base.UpdateEntities(list);
+            return _searchEngine.SaveChangesAsync();
+        }
+
+        /// <summary>
+        /// 更新实体并保存(异步)
+        /// </summary>
+        /// <param name="t">更新后的实体</param>
+        /// <returns>更新成功</returns>
+        public override Task<int> UpdateEntitySavedAsync(Post t)
+        {
+            base.UpdateEntity(t);
+            return _searchEngine.SaveChangesAsync();
         }
     }
 }