在ServiceStack / MVC4中的非控制器类中访问IAuthSession

时间:2013-06-25 19:43:25

标签: asp.net-mvc servicestack

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

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

有问题的类在Funq中使用ReuseScope.Request作用域注册(即基于每个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....
}

不幸的是,当我可以测试这种解决方法时,我不在我的开发阶段,所以不得不问其他人是否有意义。

1 个答案:

答案 0 :(得分:1)

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

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

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

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