HttpSessionStateBase теряет значения свойств наследуемого типа

Мы используем HttpSessionStateBase для хранения сообщений в конфигурации, подобной этому рабочему примеру:

public class HttpSessionMessageDisplayFetch : IMessageDisplayFetch
{
    protected HttpSessionStateBase _session;

    private IList<ICoreMessage> messages
    {
        get
        {
            if (_session[EchoCoreConstants.MESSAGE_KEY] == null)
                _session[EchoCoreConstants.MESSAGE_KEY] = new List<ICoreMessage>();

            return _session[EchoCoreConstants.MESSAGE_KEY] as IList<ICoreMessage>;
        }
    }

    public HttpSessionMessageDisplayFetch()
    {
        if (HttpContext.Current != null)
            _session = new HttpSessionStateWrapper(HttpContext.Current.Session);
    }

    public void AddMessage(ICoreMessage message)
    {
        if (message != null)
            messages.Add(message);
    }

    public IEnumerable<IResultPresentation> FlushMessagesAsPresentations(IResultFormatter formatter)
    {
        var mToReturn = messages.Select(m => m.GetPresentation(formatter)).ToList();

        messages.Clear();

        return mToReturn;
    }
}

Когда мы передаем QualityExplicitlySetMessage (который наследуется от ICoreMessage, см. Ниже), он корректно сохраняется в сообщениях.

Вот как выглядит объект после вставки в список сообщений в конце AddMessage(сообщение ICoreMessage) выше.

Но когда мы получаем доступ к нему после смены контроллеров, свойства унаследованного элемента становятся нулевыми, что вызывает множество исключений со ссылками на нуль.

Вот как выглядит объект после того, как мы вызываем FlushMessagesAsPresentations. Я закомментировал var mToReturn... так как он пытается получить доступ к одному из этих свойств нулевых ссылок.

Я хотел бы спросить следующее:

  • Почему HttpSessionStateBase не может захватить эти значения, принятые унаследованным типом?
  • Это проблема при сохранении в HttpSession или при получении?
  • Это как-то связано с, как я подозреваю, наследованием?
  • Или тот факт, что я потенциально вызываю новый контроллер, в котором зависимость внедряет HttpSessionMessageDisplayFetch, вызывает проблему?

Я новенький постер, поэтому, пожалуйста, дайте мне знать, если я делаю какие-то фальшивки - Супер стремление учиться! Любой вклад очень приветствуется.

Некоторые потенциально полезные фрагменты кода:

QualityExplicitlySetMessage

public class QualityExplicitlySetMessage : QualityChangeMessage
{
    public QualityExplicitlySetMessage(IQPossession before, IQPossession after, IQEffect qEffect)
        : base(before, after, qEffect)
    {
        IsSetToExactly = true;
    }
}

QualityChangeMessage - рабочий пример

public abstract class QualityChangeMessage : CoreMessage, IQualityChangeMessage
{
    protected PossessionChange Change;

    public PossessionChange GetPossessionChange()
    {
        return Change;
    }

    protected QualityChangeMessage(IQPossession before, IQPossession after, IQEffect qEffect)
    {
        Change = new PossessionChange(before, after, qEffect);
        StoreQualityInfo(qEffect.AssociatedQuality);
    }

    public override IResultPresentation GetPresentation(IResultFormatter formatter)
    {
        return formatter.GetQualityResult(this);
    }

    #region IQualityChangeMessage implementation

    public int LevelBefore
    {
        get { return Change.Before.Level; }
    }

    //... And so on with values dependent on the Change property.

}

CoreMessage - рабочий пример

public abstract class CoreMessage : ICoreMessage
    {

    public string MessageType
    {
        get { return GetType().ToString(); }
    }

    public string ImageTooltip
    {
        get { return _imagetooltip; }
        set { _imagetooltip = value; }
    }

    public string Image
    {
        get { return _image; }
        set { _image = value; }
    }

    public int? RelevantQualityId { get; set; }


    protected void StoreQualityInfo(Quality q)
    {
        PyramidNumberIncreaseLimit = q.PyramidNumberIncreaseLimit;
        RelevantQualityId = q.Id;
        RelevantQualityName = q.Name;
        ImageTooltip = "<strong>" + q.Name + "</strong><br/>" + q.Description + "<br>" +
                       q.EnhancementsDescription;
        Image = q.Image;
    }

    public virtual IResultPresentation GetPresentation(IResultFormatter formatter)
    {
        return formatter.GetResult(this);
    }
}

UserController - рабочий пример.

public partial class UserController : Controller
{
    private readonly IMessageDisplayFetch _messageDisplayFetch;

    public UserController(IMessageDisplayFetch messageDisplayFetch)
    {
        _messageDisplayFetch = messageDisplayFetch;
    }

    public virtual ActionResult MessagesForStoryletWindow()
    {
        var activeChar = _us.CurrentCharacter();
        IEnumerable<IResultPresentation> messages;

        messages = _messageDisplayFetch.FlushMessagesAsPresentations(_storyFormatter);

        var vd = new MessagesViewData(messages)
        {
            Character = new CharacterViewData(activeChar),
        };
        return View(Views.Messages, vd);
    }
}

0 ответов

Другие вопросы по тегам