如何将ServiceStack AuthSession注入我的存储库类?

时间:2013-07-11 18:45:40

标签: servicestack

我正在努力找到将UserAuthSession对象的当前实例(从ServiceStack的AuthUserSession派生)注入我的数据访问存储库的正确方法,以便它们自动更新更改跟踪字段插入/更新/删除操作。

如果我在我的服务代码中使用了新版本的存储库,那么我会这样做很简单:

var repo = new MyRepository(SessionAs<UserAuthSession>());

但是,我的存储库是自动连接(注入)到服务中的,因此必须从为存储库注册IOC容器定义的lambda中的某个位置抓取UserAuthSession,例如:

public class AppHost : AppHostBase
{
    public override void Configure(Container container)
    {
        container.Register<ICacheClient>(new MemoryCacheClient());
        container.Register<IRepository>(c =>
        {
            return new MyRepository(**?????**);  <-- resolve and pass UserAuthSession
        }
    }
}

现在,查看Service类的ServiceStack代码:

    private object userSession;
    protected virtual TUserSession SessionAs<TUserSession>()
    {
        if (userSession == null)
        {
            userSession = TryResolve<TUserSession>(); //Easier to mock
            if (userSession == null)
                userSession = Cache.SessionAs<TUserSession>(Request, Response);
        }
        return (TUserSession)userSession;
    }

我可以看到它根据当前的RequestResponse查找缓存的会话,但这些在lambda中无法使用。

解决方案是什么?或者我是从一个完全错误的角度来解决这个问题的?

1 个答案:

答案 0 :(得分:6)

another StackOverflow post中找到答案,该答案将请求构建的会话存储在Items的请求/线程范围的ServiceStack.Common.HostContext字典中。

我的AppHost.Configure()现在有以下代码:

// Add a request filter storing the current session in HostContext to be
// accessible from anywhere within the scope of the current request.
RequestFilters.Add((httpReq, httpRes, requestDTO) =>
{
    var session = httpReq.GetSession();
    HostContext.Instance.Items.Add(Constants.UserSessionKey, session);
});

// Make UserAuthSession resolvable from HostContext.Instance.Items.
container.Register<UserAuthSession>(c =>
{
    return HostContext.Instance.Items[Constants.UserSessionKey] as UserAuthSession;
});

// Wire up the repository.
container.Register<IRepository>(c => 
{ 
    return new MyRepository(c.Resolve<UserAuthSession>()); 
});