실제로는 종속성 주입의 정신이 아니지만 수동으로 종속성 개체를 만들고 포스트 생성 초기화 단계를 실행 한 다음 컨테이너에 '사용 가능한'개체를 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'가 호출 될 때까지 사용할 수있는 상태가 아니라는 것을 의미합니다 (예 : 이것은 객체가 가정 한 '생명주기'처럼 조금 냄새가 난다.)
개인 생성자에서 Initialize 메서드를 호출 할 수있다 ... – Sandy
감사합니다. 네 말이 맞아. 그게 효과가있어. 하지만 나는 다른 문제가 있다는 것을 알았고 실제로 앱 시작시 Initialize를 호출해야 할 수도 있습니다. 이 싱글 톤 서비스는 다른 싱글 톤 서비스에 의해 생성 된 이벤트에 가입해야합니다. 시작시에'Initialize '를 호출하는 것 이외의 다른 방법을 볼 수 없습니다. 불행히도 서비스가 둘 다 생성됩니다 (구독자는 DI로 게시자 인스턴스를 가져 와서 이벤트에 가입합니다). –
기본적으로 무엇입니까? '초기화 '는 다른 서비스 (게시자) 이벤트에 서비스를 구독하는 것입니다. 그것이 가능한 한 빨리 필요로하는 이유입니다. –