2010-08-16 151 views
2

我嘗試使用Ninject創建應用程序。我有一個MainForm和對話框窗體的設置。我應該如何實現這一點? MainForm應該有Kernel實例,然後用Get<SettingsForm>()方法創建SettingsForm?還是應該MainForm構造函數有參數SettingsForm實例?使用ninject的WinForms對話框的最佳做法是什麼?

我試過用ninject找到WinForm應用程序的一些例子,但是我發現只有一些ASP.NET應用程序在Visual C#2008中無用。

回答

5

我會使依賴關係處於表單到表單的級別。你想在這之間有一些東西。

namespace Example 
{ 
    public class SettingsRepository 
    { 
     public SettingsRepository() 
     { 

     } 
    } 
    public class SettingsForm 
    { 
     private SettingsRepository _settingsRepository; 
     public SettingsForm(SettingsRepository settingsRepository) 
     { 
      _settingsRepository = settingsRepository; 

     } 
    } 
    public class MainForm 
    { 
     private SettingsRepository _settingsRepository; 
     private Func<SettingsForm> _createSettingsForm; 
     public MainForm(Func<SettingsForm> createSettingsForm, SettingsRepository settingsRepository) 
     { 
      _createSettingsForm = createSettingsForm; 
      _settingsRepository = settingsRepository; 

     } 
    } 
} 

然後你注入Func<SettingsForm>到你的類中刪除容器/內核從您的代碼(如果你正在做內聯Get所有的地方叫,你在做服務定位,直接使用其與DI完全不同)。

public class ExampleNinjectModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<Func<SettingsForm>>().ToMethod(context =>() => context.Kernel.Get<SettingsForm>() ); 
     } 
    } 

另一種方法是增加一個Kernel到你的構造ARGS(Ninject自動解決它),但很快就變得一團糟一般。

我試着快速搜索樣本,但遺憾的是沒有在WinForms空間中快速找到任何東西。我建議或許尋找WPF的例子。

底線是,你不會出大錯,如果你:

  1. 堅持使用構造器注入,避免在您的實際代碼儘可能內核或容器的屬性直接使用
  2. 不要使用全局內核和/或服務定位

更新09月12日:這些天來一個肯定會採用Ninject.Extensions.Factory來管理工廠(即,大部分的代碼將上面會自動genned幕後)

+0

你能告訴我一些使用WPF的示例嗎?也許我是盲人,但我不能谷歌任何。或者我使用糟糕的谷歌福。 :-) – 2010-08-18 11:08:16

+0

除了+ WPF + Ninject之外,沒有任何魔法插件可以使用。也許擴大搜索範圍以尋找其他DI框架的WPF示例可能會有用嗎?在一天結束時,模式都是一樣的(只要注意濫用混合容器到應用程序的服務位置) – 2010-08-18 11:29:43

相關問題