2017-12-20 3 views
1

싱글 톤이 생성 될 때 자동으로 초기화 메서드를 호출 할 수 있습니까? 유니티 (Unity)가 일종의 일을 할 수 있다고 생각합니다. 싱글 톤이 생성 될 때 초기화 메서드를 호출 할 수 있습니까?

는 지금은 이런 식으로 뭔가를하고 있어요 : 적합하지 않습니다

class MyService : IMyService 
{ 
    public void Initialize() 
    { 
    } 
} 

을 : 서비스는 다음과 같습니다

Container.RegisterType<IMyService, MyService >(new ContainerControlledLifetimeManager()); 
Container.Resolve<IMyService>().Initialize(); 

. 을 호출 할 수 있도록 객체를 생성하는 Container.Resolve<IMyService>()으로 전화하는 것을 피할 수 있기를 바랍니다. 그리고 이것은 앱 생성시에 호출되기 때문에, 앱 시작 시간을 아프게합니다.

+3

개인 생성자에서 Initialize 메서드를 호출 할 수있다 ... – Sandy

+0

감사합니다. 네 말이 맞아. 그게 효과가있어. 하지만 나는 다른 문제가 있다는 것을 알았고 실제로 앱 시작시 Initialize를 호출해야 할 수도 있습니다. 이 싱글 톤 서비스는 다른 싱글 톤 서비스에 의해 생성 된 이벤트에 가입해야합니다. 시작시에'Initialize '를 호출하는 것 이외의 다른 방법을 볼 수 없습니다. 불행히도 서비스가 둘 다 생성됩니다 (구독자는 DI로 게시자 인스턴스를 가져 와서 이벤트에 가입합니다). –

+0

기본적으로 무엇입니까? '초기화 '는 다른 서비스 (게시자) 이벤트에 서비스를 구독하는 것입니다. 그것이 가능한 한 빨리 필요로하는 이유입니다. –

답변

1

실제로는 종속성 주입의 정신이 아니지만 수동으로 종속성 개체를 만들고 포스트 생성 초기화 단계를 실행 한 다음 컨테이너에 '사용 가능한'개체를 RegisterInstance으로 등록하는 것도 가능합니다. 당신이 해결 좋아할 복잡한 생성자 종속성이

var myService = new MyService(<ctor parameters go here>); 
myService.Initialize(); 
Container.RegisterInstance<IMyService>(myService); 

자체 MyService 경우, 부트 스트랩 동안 서비스 로케이터로 유니티를 사용할 수 있습니다 : 당신이 MyService은 싱글이라고 때문에

, 당신은 단지 하나 개의 인스턴스를 등록 할 수 있습니다 , 더 일반적인 경우

// NB : Resolve the concrete type, not the interface 
var myService = Container.Resolve<MyService>(); 
// 'Fix' the instance. 
myService.Initialize(); 
// Register via Interface 
Container.RegisterInstance<IMyService>(myService); 

(즉, 하나의 MyService 인스턴스가 공유 할 수없는 경우), 당신은 공장을 등록 할 필요를 즉을되도록방법은 각각의 새로운 인스턴스에서 호출 할 수 있습니다

container.RegisterType<IMyService>(new InjectionFactory(c => 
{ 
    var transient = c.Resolve<MyService>(); 
    transient.Initialize(); 
    return transient; 
})); 

그러나, 샌디의 코멘트 당 @로, 뭔가, (그것의 생성자가 호출 된과) 객체를 생성 한 후 점에서, 클래스 MyService의 디자인 나쁘게 보인다 객체가 'Initialize'가 호출 될 때까지 사용할 수있는 상태가 아니라는 것을 의미합니다 (예 : 이것은 객체가 가정 한 '생명주기'처럼 조금 냄새가 난다.)

+0

고맙습니다. 내가 실제로하고있는 일을 정리하기 위해 위의 Sandy에 대한 제 대답을 볼 수 있습니까? –

+0

Ouch - 이벤트를 통해 두 개의 싱글 톤을 연결하는 것은 약간 더러운 것처럼 들리지만, 이론적으로 동일한 접근 방식으로 충분해야합니다. 게시자와 구독자가 모두 싱글 톤이기 때문에 두 인스턴스를 모두 해결 한 다음 이벤트 처리기를 연결하면됩니다. 기본적으로 단일 인스턴스를 현재 위치에서 변형시키고 있으므로 핸들러를 추가 한 후에 두 인스턴스를 다시 등록 할 필요가 없습니다. – StuartLC

관련 문제