在ServiceStack应用程序中,我将Funq配置为每个请求注入一个会话,如下所示:
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);
我的服务看起来像这样,它运作得很好:
public class MyNhAwareService : Service
{
public ISession Session { get; set; }
public object Any(DoSomething request)
{
...
}
}
现在,当我想在其自己的会话工厂中添加第二个NHibernate数据库时,问题出现了:
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);
// add a different session factory
container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB2);
我一直在尝试使用Funq的各种方法,当我发现'RegisterNamed()'方法时,我认为我找到了前进的方向,但这仍然无济于事,因为我可以'在我的服务中使用除TryResolve()之外的任何东西。
这似乎应该是可能的,但我正在试图解决这个问题。我会非常感激任何建议。
答案 0 :(得分:5)
你有几种方法可以解决这个问题。
此选项是为每个NHibernate数据库创建一个独特的接口,以便Funq可以唯一地解析它们。
例如:
interface FactoryA : NHibernate.ISessionFactory
{
}
interface FactoryB : NHibernate.ISessionFactory
{
}
然后你可以像现在一样继续。这同样适用于会话。有关该过程的更多详细信息,请参见此处:
How to register multiple IDbConnectionFactory instances using Funq in ServiceStack.net
此选项我不太熟悉,但您可以使用Funq命名您的实例:
container.Register<NHibernate.ISessionFactory>("FactoryA",sessionFactoryForDB1);
然后在您的服务中,解决它:
ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");
此选项使用服务位置,我个人觉得它不那么有吸引力。