2012-03-30 63 views
0

我想弄清楚如何在Windows窗體應用程序中使用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 2012-04-02 15:39:38

+0

的第二個例子!偉大的文章。 – 2013-01-31 15:18:01