使用RavenDB和ASP.NET MVC进行会话处理

时间:2012-06-03 11:10:23

标签: asp.net-mvc ravendb

我有一个服务类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();
}

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

1 个答案:

答案 0 :(得分:6)

最简单的方法是在基本控制器上实现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