我正在努力寻找注入(inject) UserAuthSession
的当前实例的正确方法。对象(从 ServiceStack 的 AuthUserSession
派生)到我的数据访问存储库中,以便它们在插入/更新/删除操作时自动更新更改跟踪字段。
如果我在我的服务代码中更新存储库,那将是一件轻而易举的事,我会这样做:
var repo = new MyRepository(SessionAs<UserAuthSession>());
但是,我的存储库是自动连接(注入(inject))到服务中的,所以
UserAuthSession
必须从为存储库注册到 IOC 容器而定义的 lambda 中的某个位置获取,例如: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 代码类(class): 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
查找缓存 session 和 Response
,但这些在 lambda 中对我不可用。解决方案是什么?还是我从一个完全错误的角度来解决问题?
最佳答案
在 another StackOverflow post 中找到答案它将根据请求构建的 session 存储在请求/线程范围的 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>());
});
关于servicestack - 如何将 ServiceStack AuthSession 注入(inject)到我的存储库类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17601042/