C# ServiceStack在Funq.Container中实现同一接口的多个实现
在ServiceStack应用程序中,我将Funq配置为每个请求注入一个会话,如下所示: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
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");