Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ninject bind all classes implementing the same interface

I have an interface class:

public interface IStartUpTask
{
    bool IsEnabled { get; }
    void Configure();
}

I have multimple classes implementing the same interface

One of the classes looks like this:

public class Log4NetStartUpTask : IStartUpTask
{
    public bool IsEnabled { get { return true; } }

    public void Configure()
    {
        string log4netConfigFilePath = ConfigurationManager.AppSettings["log4netConfigFilePath"];
        if (log4netConfigFilePath == null)
            throw new Exception("log4netConfigFilePath configuration is missing");

        if (File.Exists(log4netConfigFilePath) == false)
            throw new Exception("Log4Net configuration file was not found");

        log4net.Config.XmlConfigurator.Configure(
            new System.IO.FileInfo(log4netConfigFilePath));
    }
}

How can i tell Ninject that i want all the classes implementing the IStartUpTask to bind to themself automatically?

I found an example using StructureMap which does this, but i don't know how to do it in Ninject.

Scan(x => {
    x.AssemblyContainingType<IStartUpTask>();
    x.AddAllTypesOf<IStartUpTask>();
    x.WithDefaultConventions();
});
like image 968
Catalin Avatar asked Mar 08 '13 09:03

Catalin


1 Answers

How can i tell Ninject that i want all the classes implementing the IStartUpTask to bind to themself automatically?

First of all, let me tell you that Ninject binds all classes to themselves automatically. You do not need to do anything special for that.

Having said that, I understand that you might want the explicit binding if you want to change scope or attach names or metadata. In this case read-on.

I do not know if it is possible to do what you are after in vanilla ninject, but you can use ninject.extensions.conventions. Using this library you can write:

Kernel.Bind(x => 
    x.FromThisAssembly()
    .SelectAllClasses()
    .InheritedFrom<IStartUpTask>()
    .BindToSelf());
like image 105
Andrew Savinykh Avatar answered Sep 23 '22 16:09

Andrew Savinykh