【问题标题】:Session handling with RavenDB and ASP.NET MVC使用 RavenDB 和 ASP.NET MVC 进行会话处理
【发布时间】:2012-06-03 19:46:06
【问题描述】:

我有一个服务类 UserService,它获取使用 AutoFac 注入的 IDocumentStore 实例。这工作正常,但现在我正在查看这样的代码:

public void Create(User user)
{
    using (var session = Store.OpenSession())
    {
        session.Store(user);
        session.SaveChanges();
    }
} 

写入数据库的每个动作都使用相同的结构:

using (var session = Store.OpenSession())
{
    dosomething...
    session.SaveChanges();
}

消除这种重复代码的最佳方法是什么?

【问题讨论】:

    标签: asp.net-mvc ravendb


    【解决方案1】:

    最简单的方法是在基本控制器上实现OnActionExecutingOnActionExecuted 并使用它。

    假设您像这样创建RavenController

    public class RavenController : Controller
    {
        public IDocumentSession Session { get; set; }
        protected IDocumentStore _documentStore;
    
        public RavenController(IDocumentStore documentStore)
        {
            _documentStore = documentStore;
        }
    
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Session = _documentStore.OpenSession();
            base.OnActionExecuting(filterContext);
        }
    
        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            using (Session)
            {
                if (Session != null && filterContext.Exception == null)
                {
                    Session.SaveChanges();
                }
            }
            base.OnActionExecuted(filterContext);
        }
    }
    

    那么您在自己的控制器中需要做的就是从RavenController 继承,如下所示:

    public class HomeController : RavenController
    {
        public HomeController(IDocumentStore store)
            : base(store)
        {
    
        }
    
        public ActionResult CreateUser(UserModel model)
        {
            if (ModelState.IsValid)
            { 
                User user = Session.Load<User>(model.email);
                if (user == null) { 
                    // no user found, let's create it
                    Session.Store(model);
                }
                else {
                    ModelState.AddModelError("", "That email already exists.");
                }
            }
            return View(model);
        }
    }
    

    够有趣的,我发现一篇博文正好展示了这种技术......

    它确实比我所做的解释更多。希望对你有更好的帮助

    Building an ASP.NET MVC app using RavenDB as a Backing Store

    【讨论】:

    • 我已经阅读了类似的说明(在 ravendb 教程中的某处),但我想将这种逻辑移动到我的服务层中,因为我认为这不应该是我的控制器的一部分。
    • 然后以同样的方式在你的 DLL 中实现它。我在我的存储库层上使用它,但我之前总是使用缓存层。
    • 我该怎么做?在我的服务类中,我没有可用的 ActionExecuting 和 ActionEcecuted。
    • 确定你不这样做,但你可以从IDisposable 继承你的服务类并在那里处理会话,在你的视图控制器上,你对所有需要访问的控制器继续使用相同的基本控制器您的数据库,但在您的存储库层上处理或调用一次性方法。
    • @balexandre 你如何处理 ConcurrencyException?当这个异常抛出时,你会向用户展示什么?使用 PRG 模式会更有趣,然后呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2014-01-24
    • 2011-06-20
    相关资源
    最近更新 更多