Reputation: 2229
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
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