2017-04-11 1 views
0

NhibernateのデータアクセスメソッドのためにUnit Unit of Workerを作成しました。 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のセッションファクトリがnullである静的コンストラクタ内のコードは、オブジェクトの作成時に実行されなかったことを、結果として理解することができました。

ここに何か不足していると確信しています。 Ninjectで静的コンストラクタを使用する正しい方法が何であるか理解してくれる人がいますか?あなたのUOWのコンストラクタは、このようにあなたはそれが静的と宣言され、一度だけ実行したい

おかげ

+0

作業単位を静的に設定する必要はありません。静的キーワードなしで動作するはずです – OrcusZ

+0

現在のNinject Binding Configurationを使用して静的に設定しないと、Ninject IOCが各解像度ごとに個別のセッションファクトリを作成します。 – Dinny

答えて

1

。なぜなら、アクセス修飾子(publicキーワード)でコンパイルするべきではありません。静的コンストラクタはアクセス修飾子(または引数)を受け入れません。あなたのコードは有効ですか?

あなたは実際に無効なアクセス修飾子なしで試したと思います。

最初に静的コンストラクターをトリガーせずにタイプを使用する方法がわかりません。たぶん、NInjectがそのことを可能にします。このような場合は、より洗練されたソリューションに置き換えてください:セッション・ファクトリをシングルトン・ライフサイクルとNInjectにインスタンス化するための適切なコード(基本的にあなたの現在のUowコンストラクタの機能)を追加し、Uowを依存性として設定します。

+0

私の悪い、私は自分自身の質問でコードを入力し、私の静的コンストラクタのアクセス修飾子について忘れてしまった。私は今それを修正します。私はあなたの提案を試して、期待どおりに働いた。私のバインディングは "()。().InSingletonScope();"静的コンストラクターをパブリック・インスタンス・コンストラクターに変更しました。ありがとう:) – Dinny

+0

@Dinnyあなたの質問への回答を投票する/評価する文化は、特にあなたの質問に実際に答える最良の答えを受け入れるべきです。また、他の回答に投票するのも一般的です。 http://stackoverflow.com/help/accepted-answerも参照してください。 – BatteryBackupUnit

関連する問題