2011-08-18 7 views
6

나는 이것이 성에서 매우 직선적일지도 모른다라고 상상할 수있다. 그러나 나는 기술에 관해 초보이고, 운이없는 몇 시간 동안 Googling하고 있었다!등록시 구성 요소를 싱글 톤으로 인스턴스화하려면 어떻게합니까?

나는 다음과 같습니다

container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
    () => new MySpecialClass()).LifeStyle.Singleton); 

실제로 성을 요청할 때까지 지금 아주 당연히이 게으른로드, 실행되지 않는 UsingFactoryMethod()에 전달 된 람다 식, 즉 나에게 것을 해결하는 것입니다 클래스의 인스턴스.

하지만 Castle에 등록한 즉시 인스턴스를 생성하고 싶습니다. 이것이 가능한가? 당신이 할 수이 간단한 경우를 들어

답변

8

당신은 너무처럼 내장이 시작 가능한 기능을 사용할 수 있습니다

container.AddFacility<StartableFacility>(); 
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start()); 

당신은 here

그것에 대해 읽을 수 있습니다
7

register an existing instance :

var special = new MySpecialClass(); 
container.Register(Component.For<MySpecialClass>().Instance(special)); 
+0

고마워요! }}}}}}}}}}}}}} 위로 가기 – jameskind

+1

컨테이너에 인스턴스화를 남기지 않고 따라서 IoC 패턴을 깨뜨리지 않기 때문에 이것은 최상의 접근 방식처럼 보이지 않습니다. –

+0

@DavidPerlman 맞습니다. 제가이 답변을 쓸 때, MosheLevi의 최근 답변이 그렇게 쉬운 방법이 아니라고 생각합니다. –

1

항상 클래스 종속성 자체의 레이어가있는 경우 (가능하지 않을 수 있습니다 "인스턴스"를 사용하여 다시 대답은, 그것은 새로운 쉽게되지 않습니다 그것 위로). 이 경우, 윈저 2.5 적어도, 당신은이를 사용할 수 있습니다

public static void ForceCreationOfSingletons(this IWindsorContainer container) 
    { 
     var singletons = 
      container.Kernel.GetAssignableHandlers(typeof (object)) 
        .Where(h => h.ComponentModel.LifestyleType == LifestyleType.Singleton); 

     foreach (var handler in singletons) 
     { 
      container.Resolve(handler.ComponentModel.Service); 
     } 
    } 

    // usage container.ForceCreationOfSingletons(); 
관련 문제