2013-07-22 3 views
1

Caliburn 1.5.2 e Autofac 3.0.2를 사용하는 .NET 4.0, WPF 앱이 있습니다.명령 줄 인수로 컨테이너 구성 사용자 정의

명령 줄 인수를 사용하여 IoC 컨테이너의 빌드를 사용자 지정하려고합니다.

문제는 명령 줄 인수는 Appplication.OnStartup (link)에서만 사용 가능하며이 문제는 Bootstrapper.Configure이 이미 호출 된 경우에만 발생합니다.

나는이 응용 프로그램 (usb 장치 통신, 웹 서비스)에서 mocking 인스턴스로 바꿀 수있는 일부 서비스를 가지고 있기 때문에 그 이유를 설명하고 싶습니다. 이러한 서비스는 등록 직후에 초기화되므로 (Autofac's AutoActivation extension) 컨테이너에 등록 할 때 사용할 유형을 선택하는 가장 좋은 순간입니다.

나는 생각 해요 :

  • 응용 프로그램의 메인 뷰 모델로 서비스의 초기화를 지연.

  • 분할 컨테이너 구성 논리는 두 단계로 구성되며, 하나는 Bootstrapper.Configure이고 다른 하나는 Bootstrapper.OnStartup입니다.

는 주요주의 사항이 그와 같습니다

  • 뷰 모델은 단지 그들을 초기화 서비스에 따라 달라집니다.
  • 컨테이너 구성을 두 부분으로 나누면 종속성 문제를 해결해야합니다.
  • 컨테이너 구성을 한 곳에서만 사용하는 것이 더 좋을 것이라고 생각합니다.

또한 Main (string [] args)을 찾고 static 인스턴스에서 매개 변수를 캐싱하는 것에 대해 생각했지만 그 코드는 WPF 앱에서 자동 생성되며 간섭은 너무 극단적 인 것으로 보입니다.

누군가가 그 일을하는 더 좋은 방법을 알고 있는지 궁금합니다.

+0

내 대답을 편집했습니다. 편집을 확인하십시오. –

답변

2
Environment.GetCommandLineArgs() 

나는 그냥 간단하게, Bootstrapper.Configure()에서 해당를 호출하고 명령 줄 스위치를 확인하십시오.

1

OnStartup() 메서드에서 컨테이너를 구성 할 수 있습니다. OnStartup()이 호출되기 전에 컨테이너에서 해당 서비스를 암시 적으로 또는 명시 적으로 요청하지 않는 한 아무런 문제가 없습니다.

Caliburn.Micro는 특별한 방법으로 Configure() 메서드를 처리하지 않습니다. 실제로 부트 스트 래퍼에서 GetInstance(), GetAllInstances() and BuildUp() 메서드에 대한 재정의를 제공하지 않으면 Configure() 메서드에서 올바르게 구성하더라도 해당 컨테이너에 등록 된 서비스를 Caliburn.Micro에서 사용할 수 없습니다.

편집 : 내가 clarifiy하고 싶었던 한가지 더. OnStartup() 메소드에서 추가 구성을 제공 할 것이므로 Bootstrapper<TRootModel> 대신에 부트 스트 래퍼를 Bootstrapper<TRootModel>에서 파생시켜야합니다. 후자는 자동으로 기본보기 모델을 표시하고 기본보기 모델은 아직 등록되지 않은 서비스를 소비 할 수 있기 때문입니다 몇 가지 문제가 발생할 수 있으므로 우리는 그것이 보여 질 때를 제어하려고합니다.어쨌든, 충분히 ㅋ ㅋ ㅋ ㅋ 여기에, 이야기하면 사용할 수있는 것입니다 :

public class AppBootstrapper : BootstrapperBase 
{ 
    SimpleContainer container; 

    public AppBootstrapper() 
    { 
     Start(); 
    } 

    protected override void Configure() 
    { 
     container = new SimpleContainer(); 
     container.Singleton<IWindowManager, WindowManager>(); 
     container.Singleton<IEventAggregator, EventAggregator>(); 
     container.PerRequest<IShell, ShellViewModel>(); 
    } 

    protected override object GetInstance(Type service, string key) 
    { 
     var instance = container.GetInstance(service, key); 
     if (instance != null) 
      return instance; 
     throw new InvalidOperationException("Could not locate any instances."); 
    } 

    protected override IEnumerable<object> GetAllInstances(Type service) 
    { 
     return container.GetAllInstances(service); 
    } 

    protected override void BuildUp(object instance) 
    { 
     container.BuildUp(instance); 
    } 

    protected override void OnStartup(object sender, System.Windows.StartupEventArgs e) 
    { 
     // ###################### 
     // DO THOSE COMMAND LINE CONFIGURATIONS HERE AND EVERYTHING 
     // SHOULD BE JUST FINE. 
     // ###################### 
     DisplayRootViewFor<IShell>(); 
    } 
} 
+0

저는 BootstrapperBase를 이미 사용하고 있습니다. 실제로 부트 스트 래퍼는 당신이 묘사 한 것입니다. 컨테이너 건물이 Configure() 메소드에 있어야한다고 믿었습니다. 왜냐하면 내가 소스를 살펴보고 IoC 클래스가 Configure()가 호출 된 직후에 구성 되었기 때문입니다. 다른 곳에서 컨피규레이션을한다면 컨테이너가 준비되지 않았다면 그때까지는 인스턴스 해결이 발생하지 않도록 보장하거나 GetInstance() 무시 및 콜베이스에 null 체크를 넣어야합니다. –

+0

@arthurnunes 'OnStartup()'메서드가 호출되기 전에 의존성을 사용하려면 대부분 정확하고 어쨌든'new' 키워드를 사용하여 수동으로 인스턴스화 할 수 있습니다. –

관련 문제