3

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

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

4

1 回答 1

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);
    }
}

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

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

使用 RavenDB 作为后备存储构建 ASP.NET MVC 应用程序

于 2012-06-03T11:39:09.483 回答