컨테이너에 단일 구성 요소 인스턴스를 등록하려는 시나리오가 있지만, 불행하게도 응용 프로그램 시작시 생성 할 수 없습니다. 이 구성 요소는 응용 프로그램 수명주기 후에 조금만 사용할 수있는 일부 개체를 전달할 때만 인스턴스화 될 수 있습니다 (단, 다른 IoC 등록 서비스는 아닙니다) [아래 참고 사항].초기 구성 후 IoC 컨테이너에 등록
- 후 IoC 컨테이너 에서 (응용 프로그램 시작에서 실행) 초기 구성 나쁜 관행을 구성 요소를 등록 있나요?
- 직접 컨테이너를 참조하지 않고이를 수행하는 방법은 무엇입니까? 등록 서비스를 추상화해야합니까?
- 시나리오를 지원하는 더 나은 방법이 있습니까? 실제 시나리오
내가 UI 컨트롤의 특정 인스턴스로 초기화되는 용기에 넣고 싶은 구성 요소에 대한
참고 따라서 I가 있고, (그것은 기본적으로 어댑터입니다) 수동으로 구성 요소 인스턴스를 만들어 컨테이너에 등록합니다.
응용 프로그램 시작시이 작업을 수행했지만 불행히도 UI 컨트롤 인스턴스를 아직 사용할 수 없으며 직접 만들 수도 없습니다.
나중에도 구체적인 클래스를 모른 채 다른 구성 요소의 표면에서 UI 컨트롤 인스턴스에 연결할 수 없습니다.
이런 이유로 UI 컨트롤을 소유하고있는 클래스에 어댑터 등록 책임을 둘 수 있다고 생각했습니다.
내 초기 시나리오 :
이public interface IDockManager { ... }
public class AcmeDockManagerAdapter : IDockManager {
public AcmeDockManager(DockControl control) { ... }
...
}
public class ShellViewModel { ... }
public class ShellView : Window {
internal DockControl theDockControl;
}
public class AnotherViewModel {
AnotherViewModel(IDockManager dockManager) { ... }
}
내가 함께 unconfortable 해요 솔루션 :
public class ShellView : Window {
internal DockControl theDockControl;
public ShellView() {
InitializeComponents();
var dockManager = new AcmeDockManagerAdapter(theDockControl);
//registration in the container
}
}
이것은 매우 우아한 해결책입니다. 그러나 내 문제는 구성 요소 인스턴스화 비용과 관련이 없으며 일부 생성자 인수의 가용성과 관련이 있습니다. 실제 인스턴스 생성을 연기하기 위해서는 적어도 지연 래퍼가 필요한 인수를 검색하는 방법을 알고 있어야하며, 마침내 인스턴스를 만들 때가옵니다. 좀 더 자세하게 설명해 줬어야했는데 어쩌면 그렇게 할 수 있습니다. 당신의 도움을 주셔서 감사합니다. –
죄송 합니다만, 질문은 뷰와 VM 사이의 배선과 관련이 없습니다 (이미 설치되어 있습니다). 문맥을 명확히하기 위해 필요한 실제 수업을 추가했습니다. 동적 추가를위한 정확한 목적을 위해 도킹 부분을 추상화하고 ShellVM에서 인터페이스를 분리합니다. 종속성 삽입을 단순화하기 위해 컨테이너에 도킹 서비스를 넣는 것이 좋겠지 만, 이미 컨테이너에 싱글 톤으로 등록 된 ShellVM에서 액세스 할 수 있습니다. –