2012-03-30 5 views
0

Windows Forms 응용 프로그램에서 NHibernate/Windsor를 사용하는 방법을 알아 내려고하고 있습니다. 나는 내 주요 방법이 있습니다윈저에 양식 등록 및 사용

좋은 작품
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

    var container = new WindsorContainer(); 

    var containerAdapter = new WindsorContainerAdapter(container); 
    var MarketingDatabaseSessionFactory = new NHibernate.Cfg.Configuration().Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.config")).BuildSessionFactory(); 

    NCommon.Configure.Using(containerAdapter) 
     .ConfigureState<DefaultStateConfiguration>(stateConfig => 
                stateConfig.UseCustomSessionStateOf<HttpSessionState>()) 
     .ConfigureUnitOfWork<DefaultUnitOfWorkConfiguration>(x => 
                  x.AutoCompleteScope()) 
     .ConfigureData<NHConfiguration>(config => config.WithSessionFactory(() => MarketingDatabaseSessionFactory) 
      .WithDistinctResults()); 



    container.AddComponent("main", typeof(Form1)); 

    container.Register(AllTypes.FromAssemblyNamed("ProductManager.Services").BasedOn(typeof(IService)).WithService.Select((t, baseType) => t.GetInterfaces())); 

    ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(container)); 

    Form1 mainForm = container.Resolve<Form1>(); 
    Application.Run(mainForm); 
} 

는 DI 내 모든 서비스에 대한 내 기본 폼에 적용됩니다. 제 질문은 어떻게 거기에서 앞으로 나아갈 수 있습니까? 첫 번째 양식이 작동하지만 다른 양식과 컨트롤에 종속성을 주입하려면 어떻게해야합니까? MVC에는 모든 컨트롤러를 등록 할 수있는 방법이 있습니다. 폼과 비슷한 것을 찾고 있습니다.하지만 폼을 명시 적으로 인스턴스화해야하기 때문에 혼란 스럽습니다. 그래서, 내가 각 폼을 하나씩 등록하더라도, 내가 어떻게하면 아이를 잃어 버릴지 모르는 모든 것을 해결하지 않고도 아이 폼이나 컨트롤을 싹쓸이 할 수 있을지 모르겠다.

답변

2

창 만들기를위한 팩토리 인터페이스를 만들 수 있습니다. 이것을 다른 양식을 작성하고 표시해야하는 양식으로 삽입하십시오.

나는 Visual Studio Magazine article (IViewFactory 구현 참조)의 WPF와 Windsor와 비슷한 것을했습니다. 이러한 접근 방식은 WinForms 로의 포팅이 매우 쉽습니다.

+0

고마워요. 내가 보니이 예의 적절한 예를 찾을 수 없었습니다. – Nick

+0

그 두 번째! 훌륭한 기사. –