9

I've got a WinForms app with the following code:

static void Main()
{
    IKernel kernel = new StandardKernel(new MyModule());
    TestInterface test = kernel.Get<TestInterface>();
}

For the Module.Load() event:

Bind<TestClass>().ToSelf().InSingletonScope();
Bind<TestInterface>().To<TestClass>();

At this point test in the Main() method is the proper object I'm expecting.

In a form later on, I'm using property injection:

[Inject]
TestInterface test {get;set;}

And once the form is loaded, trying to work with test, but it's a null object.

Thoughts?

Rush Frisby
  • 11,388
  • 19
  • 63
  • 83
mattdwen
  • 5,288
  • 10
  • 47
  • 61

2 Answers2

3

Make sure you call Inject() on the IKernel instance and pass in an instance of your form. This will ensure all dependencies are properly injected. For example...

[Inject]
TestInterface Test { get; set; }

private void Form_Load(object sender, EventArgs e)
{            
    IKernel kernel = ... // Get an instance of IKernel
    kernel.Inject(this);

    // Your form dependencies have now been injected and the 
    // Test property is ready to use
}
Kevin Babcock
  • 10,187
  • 19
  • 69
  • 89
  • 4
    Thanks Kevin, it fixes the problem, but I think I'm after a better solution. I keep reading about the "bad smell" of lots of inject and get calls, as it's not true DI. I'm trying property injection, as constructor injection just seems to get in the way whenever I instantiate an object. Having an instance of the kernel also seems backwards? – mattdwen Aug 24 '10 at 02:28
  • 1
    I agree - isn't passing an instance of the kernel almost as bad as passing a bunch of dependencies around? – Mike Chamberlain Mar 01 '11 at 06:10
  • I'm not sure how else DI could be achieved in ASP.NET...there's only so many places you can plug in to the pipeline and inject your dependencies. – Kevin Babcock Mar 02 '11 at 01:55
3

Instead of doing

var form = new MainForm()

...

class MainForm
{
    MainForm()
    {
        GlobalKernel.Inject(this)

....

You want to be doing:

var form = Kernel.Get<MainForm>()

Which obviates the need for the explicit Inject (and allows you to do constructor injection).

I dont know of any WinForms (or WPF) samples for Ninject (but it'd be a good question to ask and/or stick a bounty on -- IIRC one came up recently)

See also:

IoC/DI framworks with Smart Client Winform apps: How should I approach this?

What is the best practice for WinForms dialogs with ninject?

Community
  • 1
  • 1
Ruben Bartelink
  • 59,778
  • 26
  • 187
  • 249