簡體   English   中英

ServiceStack Funq.Container中相同接口的多個實現

[英]ServiceStack multiple implementations of same interface in Funq.Container

在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:獨特的接口

此選項是為每個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");

此選項使用服務位置,我個人覺得它不那么有吸引力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM