ActionOfWork in Action Filter似乎是缓存

时间:2011-03-17 05:45:31

标签: asp.net-mvc caching inversion-of-control unit-of-work action-filter

我有一个使用IoC(Unity)的MVC 3站点,我的模型是使用EF4和POCO生成的。我正在使用动作过滤器来提交我的UnitOfWork:

public class UseUnitOfWorkAttribute : ActionFilterAttribute, IActionFilter
{
    private readonly IUnitOfWork _unitOfWork;

    public UseUnitOfWorkAttribute()
    {
        _unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
    }

    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        _unitOfWork.Commit();
    }

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

然而,即使Commit()似乎被解雇了,它似乎也在某种程度上缓存它认为“脏”的东西。

例如,在我的控制器中,以下内容从服务类执行:

var user = _userRepository.Single(u => u.Id == 2);
user.DateAdded = DateTime.Now;

每当我重新构建解决方案并点击此控制器操作时,实际上都会提交更改。但是,对控制器的连续命中没有任何作用。

另一方面,如果我将UnitOfWork放在我的控制器中并按照服务方法调用提交它,它会按预期工作(每次我请求控制器操作时):

public AccountController()
{
    _unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
}

public ActionResult Test()
{
    var user = _userRepository.Single(u => u.Id == 2);
    user.DateAdded = DateTime.Now;
    _unitOfWork.Commit();
}

所以看起来肯定会出现某种缓存,但我无法弄清楚缓存的内容 - UnitOfWork,ActionFilter或存储库。

任何想法可能会发生什么?如果没有,任何想法我还可以做什么来排除故障?

提前致谢。

3 个答案:

答案 0 :(得分:27)

您正在操作过滤器的构造函数中初始化您的工作单元,这意味着它将在实例化操作过滤器时注入。引自ASP.NET MVC 3 release notes

  

在以前的ASP.NET MVC版本中,   每个人都创建了动作过滤器   除少数情况外请求。这个   行为从未得到保证   行为,但仅仅是一个实现   细节和过滤器合同   是认为他们无国籍。在   ASP.NET MVC 3,过滤器的缓存更多   积极。因此,任何习惯   不正确存储的动作过滤器   实例状态可能会被破坏。

答案 1 :(得分:6)

确保依赖项容器在所有位置返回相同的实例并重写过滤器以避免状态缓存:

public class UseUnitOfWorkAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
    {
        var unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
        unitOfWork.Commit();
    }

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

答案 2 :(得分:0)

我会检查你的存储库的生命周期。这当然是我们实施的罪魁祸首。