xvdiff
xvdiff

Reputation: 2229

Custom instance provider for Ninject factory

I've got the following two interfaces:

public interface ILogger {}
public interface ILoggerFactory {}

The ILoggerFactory contains a method GetLogger that takes the Type of the calling class as a parameter and returns an logger instance implementing ILogger. Now I would like to declare a instance provider that automatically wires up everything so I can inject my logger directly into a class. I tried it the following way:

Kernel.Bind<ILoggerFactory>().To<MyCustomLoggerFactory>();
Kernel.Bind<ILogger>().ToFactory(() => new LoggerFactoryInstanceProvider());

public class LoggerFactoryInstanceProvider : StandardInstanceProvider {

    protected override ... // what goes here?

}

Upvotes: 1

Views: 678

Answers (1)

BatteryBackupUnit
BatteryBackupUnit

Reputation: 13233

how about:

Kernel.Bind<ILoggerFactory>().To<MyCustomLoggerFactory>();
IBindingRoot.Bind<ILogger>().ToProvider<LoggerProvider>();

public class LoggerProvider : Provider<ILogger> {

    private readonly ILoggerFactory factory;

    public LoggerProvider(ILoggerFactory factory)
    {
         this.factory = factory;
    }

    protected override T CreateInstance(IContext context)
    {
         return this.factory.GetLogger(context.Request.ParentRequest.Service);
    }
}

If you have:

public class Foo
{
    public Foo(ILogger logger) { }

}

then ninject will use the provider to create an ILogger instance. The provider will return ILoggerFactory.GetLogger(typeof(Foo)).

Upvotes: 2

Related Questions