servicestack,funq,C#,Nhibernate,servicestack,Funq" /> servicestack,funq,C#,Nhibernate,servicestack,Funq" />

C# ServiceStack在Funq.Container中实现同一接口的多个实现

C# ServiceStack在Funq.Container中实现同一接口的多个实现,c#,nhibernate,servicestack,funq,C#,Nhibernate,servicestack,Funq,在ServiceStack应用程序中,我将Funq配置为每个请求注入一个会话,如下所示: container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1); container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>() .OpenSession()) .ReusedWi

在ServiceStack应用程序中,我将Funq配置为每个请求注入一个会话,如下所示:

container.Register<NHibernate.ISessionFactory>(sessionFactoryForDB1);
container.Register<NHibernate.ISession>(c => c.Resolve<NHibernate.ISessionFactory>()
  .OpenSession())
  .ReusedWithin(Funq.ReuseScope.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);
container.Register(sessionFactoryForDB1);
container.Register(c=>c.Resolve()
.OpenSession())
.ReusedWithin(Funq.ReuseScope.Request);
//添加不同的会话工厂
容器注册(sessionFactoryForDB2);
我一直在尝试使用Funq的各种方法,当我发现'RegisterNamed()'方法时,我认为我已经找到了前进的方向,但这仍然没有帮助,因为我无法在我的服务中使用TryResolve()之外的任何东西


这似乎是可能的,但我正在努力解决这个问题……任何建议都将不胜感激。

你有两种方法可以做到这一点

选项1:唯一接口 这个选项是为每个NHibernate数据库创建一个不同的接口,以便Funq能够唯一地解析它们

例如:

interface FactoryA : NHibernate.ISessionFactory
{
} 

interface FactoryB : NHibernate.ISessionFactory
{
} 
然后,您可以按现在的方式继续。这同样适用于会话。有关此过程的更多详细信息,请参阅此处:

选项2:命名实例 这个选项我不太熟悉,但您可以使用Funq命名您的实例:

container.Register<NHibernate.ISessionFactory>("FactoryA",sessionFactoryForDB1);
container.Register(“FactoryA”,sessionFactoryForDB1);
然后在你的服务中,解决它:

ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");
ServiceStackHost.Instance.Container.ResolveNamed(“FactoryA”);
此选项使用服务位置,我个人认为它不太吸引人。

您的选项#1似乎是更好的方法,并且不会出现神奇的字符串。感谢“ServiceStackHost.Instance.Container”指针——这是我从服务中抓取Func容器时丢失的部分!
ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");