Я бы сделал зависимость на уровне формы. Вы хотите, чтобы между этим было что-то среднее.
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
вызовы повсюду, вы выполняете Service Location, что полностью отличается от DI ).
public class ExampleNinjectModule : NinjectModule
{
public override void Load()
{
Bind<Func<SettingsForm>>().ToMethod( context => () => context.Kernel.Get<SettingsForm>() );
}
}
Другой подход - добавить Kernel
к вашим аргументам конструктора (Ninject автоматически разрешит его), но в целом это быстро превращается в беспорядок.
Я попытался быстро найти образцы, но, к сожалению, не нашел ничего быстро в пространстве WinForms. Я бы посоветовал вместо этого поискать примеры WPF.
Суть в том, что вы не ошибетесь, если:
- придерживайтесь внедрения конструктора и избегайте прямого использования атрибутов ядра или контейнера в вашем реальном коде, насколько это возможно.
- Не используйте глобальное ядро и / или расположение службы
Обновление 12 сентября: в наши дни для управления фабрикой определенно можно использовать Ninject.Extensions.Factory (т.е. большая часть кода выше будет автоматически генерироваться за кулисами)
person
Ruben Bartelink
schedule
17.08.2010