我是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....
}
不幸的是,当我可以测试这种解决方法时,我不在我的开发阶段,所以不得不问其他人是否有意义。
答案 0 :(得分:1)
我的第一个建议是尝试将IAuthSession保留在数据库类之外,因为这会产生对ServiceStack的依赖,这似乎是不必要的。
话虽这么说,我认为你可以去注册IAuthSession并让容器自动注入IAuthSession。更好的方法可能是围绕IAuthSession创建自己的“包装类”并将其注入到数据库类中。这将打破对ServiceStack的依赖。
如果没有问题保持对ServiceStack的依赖,则另一种可能性是使用SessionFeature
类并执行类似
var key = SessionFeature.GetSessionKey();
authSession = AppHost.Resolve<ICacheClient>().Get<IAuthSession>(key);