我會使依賴關係處於表單到表單的級別。你想在這之間有一些東西。
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的例子。
底線是,你不會出大錯,如果你:
- 堅持使用構造器注入,避免在您的實際代碼儘可能內核或容器的屬性直接使用
- 不要使用全局內核和/或服務定位
更新09月12日:這些天來一個肯定會採用Ninject.Extensions.Factory來管理工廠(即,大部分的代碼將上面會自動genned幕後)
你能告訴我一些使用WPF的示例嗎?也許我是盲人,但我不能谷歌任何。或者我使用糟糕的谷歌福。 :-) – 2010-08-18 11:08:16
除了+ WPF + Ninject之外,沒有任何魔法插件可以使用。也許擴大搜索範圍以尋找其他DI框架的WPF示例可能會有用嗎?在一天結束時,模式都是一樣的(只要注意濫用混合容器到應用程序的服務位置) – 2010-08-18 11:29:43