2010-04-03 4 views
1

나는까지 설정 한 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 

사용자 정의 동작을 작성해야합니까, 아니면 다른 것이 누락 되었습니까?

답변

1

이것은별로 의미가 없습니다.

첫째, 싱글 톤의 요점은 해당 항목에 의존하는 모든 것이 정확히 동일한 것을보아야한다는 것입니다. 공장 방법이 마음을 바꾸려는 경우 달성하기가 매우 어렵습니다.

또한 당신이 NHibernate ISessionFactory (당신입니까?)에 대해 이야기하고 있다면, 그것은 복구 될 수있는 이런 성격의 일시적인 실패를 가지지 않을 것입니다. (또는 가능하다면, 왜 - 나는 아니오 전문가). 세션 생성이 실패 할 수도 있지만 (그렇지만 싱글 톤으로 유지하지는 않을 것입니다.) 공장 생성에 완전히 다른 점이 있습니다 (공장에 의존하여 바보 생성자를 가질 수 없다면 어떻게 할 수 있습니까? 에 의존?).

NInject 각도에 관해서는 생성 방법 (공장 또는 제공 업체)이 범위 지정과 분리되어 있으므로 명확하게 처리하려는 것을 관리하는 방법이 될 것입니다. 시작 질문을 해결할 수 있다면 두 가지 질문이 있습니다.) 소스를 보는 것이 좋습니다. 짧고 깨끗하므로 대답이 있으면 바로 뛰어 올 것입니다. 다운로드하는 데 1 분도 안 걸릴 것입니다. 마지막으로

하는 good article on managing NHibernate sessions 지금

(IIRC 세션 팩토리 작성 실패에 대한 조항을 나던 어느) 사실 관계의 질문에 대답 여부는 나쁜 - 실패에서 발생하는 것이 가능했던 경우 팩토리를 생성하기 위해 재 시도 논리 (Factory를 생성하기 위해)를 옮기면됩니다. 세션 생성에 대한 책임이있는 제공자 또는 방법. 그러면 적합하다고 판단되는 방식으로 재 시도 할 수 있습니다.

+0

나는 NHibernate에 대해 이야기하고있다. 실패한 SessionFactory 자체는 아니며, 좀 더 복잡합니다 (해빙 해제 사용). Sessionfactory를 생성하기 위해서는 ISessionFactoryProvider가 필요합니다. 그러면 IConfigurationProvider가 필요합니다.이 구성은 데이터베이스에 연결할 수 없기 때문에 실패 할 수있는 NHibernate 구성을 생성합니다 ... 결국, SessionFactory IS는 구성, 적어도 언 하딘을 사용할 때. 엄격한 싱글 톤 동작을 시행하고 싶지 않습니다. 출처 : http://code.google.com/p/testbat/source/browse/trunk/TestBat.GuyWire.Modules/ModelModule.cs –

+0

간단히 말해서 다음과 같이 호출됩니다. SessionFactory sf = new Configuration() .configure(). buildSessionFactory(); 그리고 configure() - 부분은 실패하므로 설정이 잘못되었을 때 SessionFactory가 생성되지 않습니다.그러나 응용 프로그램은 사용자에게 구성을 변경하고 SessionFactory를 다시 만들 수있는 기회를 제공해야합니다. –

+0

@ Maxixilian Csuk : 나는 그런 종류의 일이라고 생각했다. 나는 나의 반응의 일반적인 원칙에 따라 설 수있다 : 당신은 안정을 유지하기 위해 어떤 것들이 필요하다. 재시도 논리를 지원/필요/필요로한다면 단순 싱글 톤이 아닌 팩토리가 있습니다. 이를 수행하는 방법은 실패를 전달할 수있는 메소드 또는 제공자에게 '세션'을 바인드하는 것입니다. Ninject는 NHibernate가 그 방향으로 어떠한 기본 정책도 가지지 않는 것과 같은 방식으로 재시도 로직에 관심이 없다. –

관련 문제