私は次のようにNInject(バージョン1.5を使用)バインディングを設定しました:
Bind<ISessionFactory>().ToMethod<ISessionFactory>(ctx =>
{
try
{
// create session factory, might fail because of database issues like wrong connection string
}
catch (Exception e)
{
throw new DatabaseException(e);
}
}).Using<SingletonBehavior>();
ご覧のとおり、このバインディングはシングルトン動作を使用しますが、データベースへの接続文字列が間違っているなど、何かが正しく構成されていない場合にも例外をスローする可能性があります。
これで、セッションファクトリの作成が最初に失敗した場合(データベース例外がスローされた場合)、NInjectはオブジェクトの再作成を試みませんが、常にnullを返します。
最初にnullをチェックし、インスタンスがnullのときに再作成するには、NInjectが必要ですが、もちろん、インスタンスが正常に構築されている(シングルトンを維持している)場合は必要ありません。このような:
var a = Kernel.Get<ISessionFactory>(); // might fail, a = null
// ... change some database settings
var b = Kernel.Get<ISessionFactory>(); // might not fail anymore, b = ISessionFactory object
カスタム動作を作成する必要がありますか、それとも何か他のものが欠けていますか?