使用simple-injector保存会话对象的问题

时间:2016-01-21 19:29:38

标签: asp.net-mvc simple-injector

我有MVC应用程序,我试图使用简单注入器的DI框架在会话中保存一些对象。 我将对象注册如下

container.RegisterPerWebRequest<Func<HttpSessionState>>(() => 
    () => HttpContext.Current.Session);
container.RegisterSingle<MemoryCache>(() => MemoryCache.Default);
container.RegisterPerWebRequest<ISessionCacheService, SessionCacheService>();

现在在会话服务构造函数中,我能够看到sessionstate对象的多播委托,但是当我尝试添加其他对象时,我得到了Object引用错误。构造函数列在下面

protected internal Func<HttpSessionState> _HttpSessionState;
public SessionCacheService(Func<HttpSessionState> httpSessionState)
{
    _HttpSessionState = httpSessionState;
}

我在此服务的方法中的以下代码行中收到错误

public void Set<T>(string key, T data)
{
    _HttpSessionState()[key] = data;
}

这里我可以看到以下变量为null

this._HttpSessionState()

我们需要使用此构造的主要原因是我们需要将多播委托存储到会话中,如下例所示

public RuntimeContext Current
{
    get
    {
        Func<RuntimeContext> getRuntimeContextFunc = () =>
        {
            return new RuntimeContext() 
            { 
                ImpersonatingAgentId = Guid.Empty 
            };
        };
        return this._SessionCacheService.Get<RuntimeContext>(
            typeof(RuntimeContext).ToString(), 
            getRuntimeContextFunc);
    }
}

稍后我们可以使用get方法从会话中检索这些项目

public T Get<T>(string key, Func<T> acquire)
{
    if (this.IsSet(key))
    {
        return this.Get<T>(key);
    }
    else
    {
        var result = acquire();
        this.Set<T>(key, result);
        return result;
    }
}

0 个答案:

没有答案