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

Dav*_*ery 3 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);
Run Code Online (Sandbox Code Playgroud)

我的服务看起来像这样,它的工作正常:

public class MyNhAwareService : Service
{
   public ISession Session { get; set; }

   public object Any(DoSomething request)
   {
   ...
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我想在其自己的会话工厂中添加第二个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);
Run Code Online (Sandbox Code Playgroud)

我一直在尝试用各种方式Funq可以使用,我想我已经找到了前进的时候,我发现了"RegisterNamed()"方法,但仍然没有帮助,因为我不能用什么除了我的服务中的TryResolve().

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

Jef*_*ell 5

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

选项1:独特的接口

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

例如:

interface FactoryA : NHibernate.ISessionFactory
{
} 

interface FactoryB : NHibernate.ISessionFactory
{
} 
Run Code Online (Sandbox Code Playgroud)

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

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

选项2:命名实例

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

container.Register<NHibernate.ISessionFactory>("FactoryA",sessionFactoryForDB1);
Run Code Online (Sandbox Code Playgroud)

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

ServiceStackHost.Instance.Container.ResolveNamed<NHibernate.ISessionFactory>("FactoryA");
Run Code Online (Sandbox Code Playgroud)

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