【问题标题】:Custom instance provider for Ninject factoryNinject 工厂的自定义实例提供程序
【发布时间】:2014-06-23 15:08:14
【问题描述】:

我有以下两个接口:

public interface ILogger {}
public interface ILoggerFactory {}

ILoggerFactory 包含一个方法GetLogger,它将调用类的Type 作为参数,并返回一个实现ILogger 的记录器实例。现在我想声明一个自动连接所有东西的实例提供程序,这样我就可以将我的记录器直接注入到一个类中。我尝试了以下方式:

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

public class LoggerFactoryInstanceProvider : StandardInstanceProvider {

    protected override ... // what goes here?

}

【问题讨论】:

    标签: c# logging dependency-injection inversion-of-control ninject


    【解决方案1】:

    怎么样:

    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);
        }
    }
    

    如果你有:

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

    然后ninject 将使用提供者创建一个ILogger 实例。提供者将返回ILoggerFactory.GetLogger(typeof(Foo))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多