2017-04-11 67 views
0

我爲我的Nhibernate數據訪問方法創建了工作單元包裝。我在UnitOfWork類的靜態構造函數中初始化了我的會話工廠,希望只初始化一次。使用靜態構造函數創建ninject依賴項

public class UnitOfWork : IUnitOfWork 
{ 
    private static readonly ISessionFactory _sessionFactory; 
    static UnitOfWork() 
    { 
     var oracleConfiguration = OracleDataClientConfiguration.Oracle10.ConnectionString(ConfigurationManager.ConnectionStrings[Constants.CONNECTION_STRING].ConnectionString); 
     _sessionFactory = Fluently.Configure() 
          .Database(oracleConfiguration) 
          .Mappings(m => m.FluentMappings.Add<MyMap>()) 
          .BuildSessionFactory(); 
    } 
} 

我然後綁定Ninject內核中,這依賴的UnitOfWork我的應用程序啓動時,然後期望Ninject來解決它在我的數據訪問庫的構造。 (我正在使用構造函數注入)。

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWork>().To<UnitOfWork>(); 
    }                  
} 

但分辨率後,我可以理解,靜態構造函數中的代碼對象創建過程中從未執行,結果我的NHibernate的Session的工廠爲空。

我確定我在這裏錯過了一些東西。有人能幫我理解在Ninject中使用靜態構造函數的正確方法是什麼?

感謝

+0

您不需要將您的工作單元設置爲靜態。它應該沒有靜態關鍵字 – OrcusZ

+0

如果我沒有將它設置爲靜態,使用我當前的Ninject綁定配置,則會導致Ninject IOC爲每個分辨率創建單獨的會話工廠。 – Dinny

回答

1

你想只執行一次你的UOW構造,因此你聲明爲靜態。爲什麼不,但不應該使用訪問修飾符編譯(public關鍵字)。靜態構造函數不接受訪問修飾符(或參數)。你確定你的代碼是有效的嗎?

我想你已經嘗試了沒有無效的訪問修飾符。

我不知道如何在不觸發靜態構造函數的情況下使用類型。也許NInject能夠做到這一點。在這種情況下,只需回退到一個更乾淨的解決方案:使用單例生命週期和適當的代碼來將您的會話工廠添加到NInject(實質上是您當前的Uow構造函數所做的),然後將您的Uow設置爲依賴項。

+0

我的不好,我在問題中自己鍵入了代碼,並忘記了我的靜態構造函數中的訪問修飾符。我現在要糾正它。我嘗試了你的建議,並且按預期工作。我的綁定是「綁定()。到().InSingletonScope();」並且我已將靜態構造函數更改爲Public Instance構造函數。謝謝:) – Dinny

+0

@Dinny這是文化投票/評分答案,你應該特別接受實際回答你的問題的最佳答案,並且對其他答案進行投票也很常見。另請參閱http://stackoverflow.com/help/accepted-answer – BatteryBackupUnit