2010-03-22 5 views
2

Windsor가 유형을 인스턴스화 할 때 사용자 정의 처리를 수행 할 수 있습니까? 유사Castle Windsor : 서비스 시작시 사용자 정의 처리

뭔가 :

 container.Register(
        AllTypes.Pick() 
         .FromAssembly(Assembly.GetExecutingAssembly()) 
         .BasedOn<MyMarkerInterface>() 
         .WhenInstantiating(instance => // do some stuff with this instance) 
         .Configure(component => component.Startable().LifeStyle.Singleton) 
         .WithService.Base()); 

는 현재 우리가 IStartable을 사용하고 있습니다. '시작'코드 (즉 맞춤 처리)가 동일하기 때문에 각 클래스에서이 로직을 이동하는 것이 좋습니다.

감사합니다. 브라이언

답변

5

OnCreate과 같은 의미입니까?

container.Register(
       AllTypes.FromAssembly(Assembly.GetExecutingAssembly()) 
        .BasedOn<MyMarkerInterface>() 
        .WithService.Base() 
        .OnCreate((kernel, instance) => instance.CreatedAt = DateTime.Now) 
); 

싱글 톤은 기본 라이프 스타일이므로 명시 적으로 지정할 필요가 없습니다.

그러나 시작 기능이 작동하는 방식과 비교할 때 동작이 약간 다릅니다.

  • 구성 요소를 시작할 수 있으면 가능한 한 빨리 (필요한 모든 종속성을 사용할 수있게 됨) 인스턴스화되고 시작됩니다.
  • OnCreate는 구성 요소가 컨테이너에서 반환되기 전에 호출되지만 사전에 생성하지는 않습니다. 따라서 이이 구성 요소를 절대 가져 오지 않으면 OnCreate는 호출되지 않습니다.

또한 OnCreate가 시설에 거주한다고 표시되어 있지만 더 이상 사실이 아닙니다 (예 : 문서를 업데이트해야 함). 이 방법은 즉시 사용할 수 있습니다.

+0

+1하지만 컨테이너가 인식 할 수없는 솔루션은 장식입니다 :) –

+1

나는 장식에 대해 잘 모르겠습니다. 당신은 논리를 어디에 두겠습니까? 박사님? 구성 요소가 완전히 인스턴스화되면, 즉 속성이 연결된 상태에서 실행되도록하려면 어떻게해야합니까? 어떤 방법으로도 처음 호출 할 때 지연 호출? 정말 좋은 생각인지 모르겠다. –

+0

감사 Krysztof. 다른 독자의 경우, OnCreate 메소드가 릴리스 2.1.0에 추가되었습니다. –