ServiceStack Funq.Container中相同接口的多个实现

时间:2014-05-17 03:56:07

标签: c# nhibernate servicestack funq

在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()之外的任何东西。

这似乎应该是可能的,但我正在试图解决这个问题。我会非常感激任何建议。

1 个答案:

答案 0 :(得分:5)

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

选项1:唯一接口

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

例如:

interface FactoryA : NHibernate.ISessionFactory
{
} 

interface FactoryB : NHibernate.ISessionFactory
{
} 

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

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");

此选项使用服务位置,我个人觉得它不那么有吸引力。