我正在努力找到将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;
}
我可以看到它根据当前的Request
和Response
查找缓存的会话,但这些在lambda中无法使用。
解决方案是什么?或者我是从一个完全错误的角度来解决这个问题的?
答案 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>());
});