Подтвердить что ты не робот

Фильтр UnitOfWork в действии, похоже, кэшируется

У меня есть сайт MVC 3, в котором используется IoC (Unity), и моя модель сгенерирована с помощью EF4 и POCOs. Я использую фильтр действий для фиксации моего 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 или репозиторий.

Любые идеи, что может быть? И если нет, какие-нибудь идеи, что еще я могу сделать для устранения неполадок?

Спасибо заранее.

4b9b3361

Ответ 1

Вы инициализируете свой блок работы в конструкторе фильтра действий, что означает, что он будет введен, когда будет создан экземпляр фильтра действий. Цитата из примечаний ASP.NET MVC 3:

В предыдущих версиях ASP.NET MVC, фильтры действий были созданы за запрос, за исключением нескольких случаев. Эта поведение никогда не гарантировалось но просто реализация подробно и контракт на фильтры было рассматривать их без гражданства. В ASP.NET MVC 3, фильтры кэшируются больше агрессивно. Поэтому любой пользовательский фильтры действия, которые неправильно хранятся состояние экземпляра может быть нарушено.

Ответ 2

Убедитесь, что контейнер зависимостей возвращает один и тот же экземпляр во всех местах и ​​переписывает фильтр, чтобы избежать кэширования состояния:

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

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {
    }
}

Ответ 3

Я бы проверил время жизни в вашем репозитории. Это, безусловно, является виновником нашей реализации.