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

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 数据库添加到它自己的 session 工厂中时,问题就出现了:
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() 。

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

最佳答案

你有几种方法可以解决这个问题。
选项 1:独特的接口(interface)
这个选项是为每个 NHibernate 数据库创建一个不同的接口(interface),以便它们可以被 Funq 唯一地解析。
例如:

interface FactoryA : NHibernate.ISessionFactory
{
}

interface FactoryB : NHibernate.ISessionFactory
{
}
然后你可以像现在一样继续。这同样适用于 session 。有关该过程的更多详细信息,请参见此处:
How to register multiple IDbConnectionFactory instances using Funq in ServiceStack.net
选项 2:命名实例
这个选项我不太熟悉,但你可以使用 Funq 命名你的实例:
container.Register<NHibernate.ISessionFactory>("FactoryA",sessionFactoryForDB1);
然后在您的服务中,这样解决它:
ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");
此选项使用服务位置,我个人认为它不太吸引人。

关于c# - Funq.Container中同一接口(interface)的ServiceStack多个实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23707406/

10-13 02:21