我已经设置了一个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。
我需要NInject首先检查null并在实例为null时重新创建,但当然已经没有成功构造实例(保持单例)。像这样:
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
我是否需要编写自定义行为,或者我错过了其他内容?
答案 0 :(得分:1)
这没有多大意义。
首先,单身人士的观点是,依赖于该项目的所有内容都应该看到完全相同的东西 - 如果您的工厂方法会改变主意,这很难实现。
另外,如果你在谈论一个NHibernate ISessionFactory
(你呢?),它不会有这种性质的短暂失败可以恢复(或者如果它可以,你能解释为什么 - 我我没有专家。我很欣赏会话的创建可能会失败(但你不会把它保持为单身),但这与工厂失败的创建完全不同(如果你不能依靠你的工厂来建造愚蠢的构造函数,那么你能做什么?依靠?)。
就NInject角度而言,创建方法(无论是工厂还是提供商)与范围界定是分开的,所以我怀疑是否有办法管理你想干净利落的事情(即使你可以解决开场两个问题)。我强烈建议您查看来源 - 它简短而干净,所以如果有答案,它会直接向您发出。下载不会超过一分钟 - 去做吧!
最后,good article on managing NHibernate sessions(哪个IIRC没有为会话工厂创建失败提供任何条款)
现在,要实际回答这个问题,不管它是否是一个坏问题 - 如果在工厂创建中可能发生故障,你就无法调整工厂以便不这样做(多少次重试您是否看过创建工厂?),答案是您将重试逻辑(用于创建工厂)移动到负责创建Sessions的Provider或Method中,然后可以以您认为合适的方式重试。