servicestack - 如何将 ServiceStack AuthSession 注入(inject)到我的存储库类中?

标签 servicestack

我正在努力寻找注入(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 存储在请求/线程范围的 ItemsServiceStack.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/

相关文章:

缺少 ServiceStack 元数据描述

rest - Ajax 请求使用 ServiceStack 返回空响应

silverlight 的 Servicestack 身份验证服务

session - 使用 ServiceStack session 功能时检测 session 开始(类似于 Global.asax Session_Start)的最佳方法是什么?

c# - ServiceStack 自托管应用重启

redis - 如何使用 Structuremap 在自定义命名空间中将 Redis 设置为 ServiceStack Web 应用程序上的缓存和 MQ

c# - Servicestack 对象参数未通过 Swagger-UI 传递给服务

servicestack - 如何在 ServiceStack 请求处理程序中访问表单发布值

具有继承的 ServiceStack DTO

servicestack - 使用 ServiceStack 客户端时,为什么我的 ServiceStack 服务会收到 401 响应