나는까지 설정 한 Ninject에 (사용 버전 1.5)과 같은 바인딩 : 당신이 볼 수 있듯이인스턴스화 오류 및 싱글 - 행동의 상호 작용은 [NInject1]
이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
사용자 정의 동작을 작성해야합니까, 아니면 다른 것이 누락 되었습니까?
나는 NHibernate에 대해 이야기하고있다. 실패한 SessionFactory 자체는 아니며, 좀 더 복잡합니다 (해빙 해제 사용). Sessionfactory를 생성하기 위해서는 ISessionFactoryProvider가 필요합니다. 그러면 IConfigurationProvider가 필요합니다.이 구성은 데이터베이스에 연결할 수 없기 때문에 실패 할 수있는 NHibernate 구성을 생성합니다 ... 결국, SessionFactory IS는 구성, 적어도 언 하딘을 사용할 때. 엄격한 싱글 톤 동작을 시행하고 싶지 않습니다. 출처 : http://code.google.com/p/testbat/source/browse/trunk/TestBat.GuyWire.Modules/ModelModule.cs –
간단히 말해서 다음과 같이 호출됩니다. SessionFactory sf = new Configuration() .configure(). buildSessionFactory(); 그리고 configure() - 부분은 실패하므로 설정이 잘못되었을 때 SessionFactory가 생성되지 않습니다.그러나 응용 프로그램은 사용자에게 구성을 변경하고 SessionFactory를 다시 만들 수있는 기회를 제공해야합니다. –
@ Maxixilian Csuk : 나는 그런 종류의 일이라고 생각했다. 나는 나의 반응의 일반적인 원칙에 따라 설 수있다 : 당신은 안정을 유지하기 위해 어떤 것들이 필요하다. 재시도 논리를 지원/필요/필요로한다면 단순 싱글 톤이 아닌 팩토리가 있습니다. 이를 수행하는 방법은 실패를 전달할 수있는 메소드 또는 제공자에게 '세션'을 바인드하는 것입니다. Ninject는 NHibernate가 그 방향으로 어떠한 기본 정책도 가지지 않는 것과 같은 방식으로 재시도 로직에 관심이 없다. –