3

在 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() 除外。

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

4

1 回答 1

5

你有几种方法可以解决这个问题。

选项 1:独特的接口

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

例如:

interface FactoryA : NHibernate.ISessionFactory
{
} 

interface FactoryB : NHibernate.ISessionFactory
{
} 

然后你可以像现在一样继续。这同样适用于会话。有关该过程的更多详细信息,请参见此处:

如何在 ServiceStack.net 中使用 Funq 注册多个 IDbConnectionFactory 实例

选项 2:命名实例

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

container.Register<NHibernate.ISessionFactory>("FactoryA",sessionFactoryForDB1);

然后在您的服务中,这样解决它:

ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");

此选项使用服务位置,我个人认为它不太有吸引力。

于 2014-05-19T15:44:12.303 回答