Search code examples
ninjectninject-extensions

NInject kernel GetAll returns empty


I've two projects (class library projects) which implement one interface:

The first one:

public class MailPlugin : Extensibility.IProductorPlugin
{
    ...
}

The second one:

public class FileSystemPlugin : Extensibility.IProductorPlugin
{
    ...
}

Extensibility.IProductorPlugin, is a interface of a third project:

namespace Extensibility
{
    public delegate void NotifyDigitalInputs(List<Domain.DigitalInput> digital_inputs);


    public interface IProductorPlugin
    {


        String Name { get; }
        String Description { get; }
        String Version { get; }


        List<Domain.Channel> AvailableChannels { get; }
        IEnumerable<Guid> TypeGuids { get; }


        event NotifyDigitalInputs OnDigitalInputs;


    }
}

In my composition root, I've created this class:

namespace UI
{
    public sealed class NinjectServiceLocator
    {


        private static readonly Lazy<NinjectServiceLocator> lazy = new Lazy<NinjectServiceLocator>(() => new NinjectServiceLocator());

        public static NinjectServiceLocator Instance { get { return lazy.Value; } }


        public Ninject.IKernel Kernel { get; private set; }


        private NinjectServiceLocator()
        {
            using (var k = this.Kernel = new Ninject.StandardKernel())
            {
                k.Bind(b => b.FromAssembliesMatching("*")
                    .SelectAllClasses()
                    .InheritedFrom(typeof(Extensibility.IProductorPlugin))
                    .BindAllInterfaces()
                );
            }
        }
    }
}

So, when I want to look for all plugins, I just perform this:

protected void initialize()
{
    foreach (Extensibility.IProductorPlugin productor_plugin in NinjectServiceLocator.Instance.Kernel.GetAll(typeof(Extensibility.IProductorPlugin)))
    {
        using (var channel_tile = new DevExpress.XtraBars.Docking2010.Views.WindowsUI.Tile() { Group = "Plugin Channels" })
        {
            foreach (Domain.Channel channel in productor_plugin.AvailableChannels)
            {
                channel_tile.Elements.Add(new DevExpress.XtraEditors.TileItemElement() { Text = channel.Name });
                channel_tile.Elements.Add(new DevExpress.XtraEditors.TileItemElement() { Text = channel.Description });

                this.tileContainer1.Items.Add(channel_tile);
            }
        }
    }
}

However, GetAll returns anything. What am I doing wrong? I'll appreciate a lot your help.

Thanks for all.


Solution

  • try removing the using() from around the Kernel instantiation. a using will dispose the object at the end of the scope, which we don't want for a kernel.

    using (var k = this.Kernel = new Ninject.StandardKernel())