Как лучше всего использовать диалоги WinForms с помощью ninject?

Я пытаюсь создать приложение с помощью Ninject. У меня есть один MainForm и диалоговая форма для настроек. Как мне это реализовать? Должен ли MainForm иметь экземпляр Kernel, а затем создать SettingsForm с помощью метода Get<SettingsForm>()? Или конструктор MainForm должен иметь параметр с экземпляром SettingsForm?

Я попытался найти пример приложения WinForm с помощью ninject, но нашел только некоторые приложения ASP.NET, которые бесполезны в Visual C # 2008 Express.


person Lukas Pirkl    schedule 16.08.2010    source источник


Ответы (1)


Я бы сделал зависимость на уровне формы. Вы хотите, чтобы между этим было что-то среднее.

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.

Суть в том, что вы не ошибетесь, если:

  1. придерживайтесь внедрения конструктора и избегайте прямого использования атрибутов ядра или контейнера в вашем реальном коде, насколько это возможно.
  2. Не используйте глобальное ядро ​​и / или расположение службы

Обновление 12 сентября: в наши дни для управления фабрикой определенно можно использовать Ninject.Extensions.Factory (т.е. большая часть кода выше будет автоматически генерироваться за кулисами)

person Ruben Bartelink    schedule 17.08.2010
comment
Можете ли вы рассказать мне несколько примеров с WPF? Может, я слепой, но гуглить не умею. Или я использую плохой гугл-фу. :-) - person Lukas Pirkl; 18.08.2010
comment
На ум приходят никакие магические заклинания, кроме + WPF + Ninject. Возможно, было бы полезно расширить поиск и найти примеры WPF для других фреймворков DI? В конце концов, шаблоны все те же (просто остерегайтесь злоупотребления смешиванием контейнера в приложении и местоположении службы) - person Ruben Bartelink; 18.08.2010