MVC3, Unity Framework и Per Session Lifetime Manager Проблема - PullRequest
4 голосов
/ 07 февраля 2012

Одним словом я пытаюсь создать Lifetime manager для платформы Unity с помощью Http Session в моем проекте MVC3. Мой пример реализации пожизненного менеджера:

    public class UnityPerSessionLifetimeManager : LifetimeManager
    {
        private string sessionKey;
        private HttpContext ctx;

        public UnityPerSessionLifetimeManager(string sessionKey)
        {
            this.sessionKey = sessionKey;
            this.ctx = HttpContext.Current;
        }

        public override object GetValue()
        {
            return this.ctx.Session[this.sessionKey];
        }

        public override void RemoveValue()
        {
            this.ctx.Items.Remove(this.sessionKey);
        }

        public override void SetValue(object newValue)
        {
            this.ctx.Session[this.sessionKey] = newValue;
        }
    }

В моем global.asax.cs я заменил фабрику контроллера по умолчанию на свой собственный UnityControllerFactory

    public class UnityControllerFactory : DefaultControllerFactory
    {
        private IUnityContainer container;

        public UnityControllerFactory(IUnityContainer container)
        {
            this.container = container;
            this.RegisterServices();
        }

        protected override IController GetControllerInstance(RequestContext context, Type controllerType)
        {
            if (controllerType != null)
            {
                return this.container.Resolve(controllerType) as IController;
            }

            return null;
        }

        private void RegisterServices()
        {
            this.container.RegisterType<IMyType, MyImpl>(new UnityPerSessionLifetimeManager("SomeKey"));
        }
    }
}

Я установил точки останова для каждой функции класса UnityPerSessionLifetimeManager, и заметил, что когда фабрика контроллеров пытается решить зависимости моего контроллера, HttpContext.Session фактически имеет значение null, поэтому код не может быть получен из сеанса или сохранен в сеансе.

Есть идеи, почему сессия на этом этапе пуста?

1 Ответ

4 голосов
/ 07 февраля 2012

Моя ошибка, я должен изменить код класса UnityPerSessionLifetimeManager на

public class UnityPerSessionLifetimeManager : LifetimeManager
{
    private string sessionKey;

    public UnityPerSessionLifetimeManager(string sessionKey)
    {
        this.sessionKey = sessionKey;
    }

    public override object GetValue()
    {
        return HttpContext.Current.Session[this.sessionKey];
    }

    public override void RemoveValue()
    {
        HttpContext.Current.Session.Remove(this.sessionKey);
    }

    public override void SetValue(object newValue)
    {
        HttpContext.Current.Session[this.sessionKey] = newValue;
    }
}

, потому что, когда конструктор вызывался для регистрации типа, состояние сеанса еще не готово, и я уже назначил http-контекст этоговремя переменной.Но в более поздних функциях Get / Set состояние сеанса готово.

...