【问题标题】:Accessing IAuthSession in non-controller classes in ServiceStack/MVC4在 ServiceStack/MVC4 的非控制器类中访问 IAuthSession
【发布时间】:2013-06-27 02:58:25
【问题描述】:

我是 ServiceStack 的新手,所以这可能是一个菜鸟问题:

我正在开发一个使用 ServiceStack 的 ASP.NET MVC4 应用程序,并试图弄清楚如何从我的 MVC4 使用的类(EF 上下文或 PetaPoco 数据库)中获取当前 IAuthSession从 ServiceStackController 派生的控制器。

有问题的类是在具有 ReuseScope.Request 范围的 Funq 中注册的(即基于每个 HTTP 请求),理想情况下,我希望它的每个实例都使用构造函数参数与当前 IAuthSession 自动装配或公共财产。

我该怎么做?


更新

经过一番挖掘,我想出了我认为可行的方法。

在我的AppHost.Configure 中,我注册了一个从当前请求返回会话的 lambda:

container.Register<IAuthSession>(c =>
    HttpContext.Current.Request.ToRequest().GetSession());

还有:

container.RegisterAutoWired<EFCatalogDb>();

EFCatalogDb 是我的 EF 上下文,它采用 IAuthSession 作为构造函数参数:

public class EFCatalogDb : DbContext
{
    public EFCatalogDb(IAuthSession session) : base()
    { }
    // ...etc....
}

不幸的是,当我可以测试此解决方法时,我还没有处于开发阶段,因此必须询问其他人是否有意义。

【问题讨论】:

标签: asp.net-mvc servicestack


【解决方案1】:

我的第一个建议是尝试将 IAuthSession 排除在您的数据库类之外,因为这会创建对 ServiceStack 的依赖,这似乎是不必要的。

话虽如此,我认为您可以走注册 IAuthSession 并让容器自动注入 IAuthSession 的路线。更好的方法可能是围绕 IAuthSession 创建您自己的“包装类”并将其注入到您的数据库类中。这将打破对 ServiceStack 的依赖。

如果保持对 ServiceStack 的依赖没有问题,另一种可能性是使用 SessionFeature 类并执行类似

var key = SessionFeature.GetSessionKey();
authSession = AppHost.Resolve<ICacheClient>().Get<IAuthSession>(key);

【讨论】:

  • 谢谢,我不知道 SessionFeature 中存在这样的功能。我不介意在我的 DAL 中额外依赖 ServiceStack,因为我已经将它用于日志记录。
  • 当我尝试实施您的建议时,我得到了这个:System.NotImplementedException: Only ASP.NET Requests accessible via Singletons are supported。它出错是因为SessionFeature.GetSessionId() 需要IHttpRequest 包装器或HttpContext.Current,尽管我使用JsonServiceClient 调用我的服务,但由于某种原因后者为空。知道为什么我的HttpContext 不见了吗?
  • 也许你需要添加 SessionFeature 插件 - github.com/ServiceStack/ServiceStack/wiki/Sessions
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多