我正在我的(WCF)项目中加载一个ninject模块,并希望使用自定义提供程序在我的模块中连接log4net。我使用提供程序的原因是GetLogger方法需要通过正在进行注入的类。如果这不是这样做的方式,请告诉我,我是Ninject的新手。 (Context.getType()不正确顺便说一句,我在这方面遇到了一些麻烦。)
主要问题是我的类中的ILog变量在构造函数执行后得到了<< strong>,但是我希望能够在构造函数中使用日志记录。我也在使用Ninject来调用我的构造函数并将它的参数绑定到具体的类。
Bind<IBroker>().To<Broker>(); // constructor
Bind<ILog>().ToProvider(new log4netILogProvider()) // property
private class log4netILogProvider : Ninject.Activation.Provider<ILog>
{
protected override ILog CreateInstance(IContext context)
{
return LogManager.GetLogger(context.getType());
}
}
感谢所有帮助。
答案 0 :(得分:2)
在构造函数注入之前,没有IoC框架能够进行属性注入。 IoC框架只能在手动编写的工厂中执行相同的操作。在创建对象之前,您无法访问该对象的属性吗?所以不能是IoC框架。
基本上你有两种选择。
执行方法注入并在方法中执行构造函数。
[Inject]
public void Initialize(ILog log) { ... }
答案 1 :(得分:0)
我还建议第三种选择。您可以实现Ninject的IInitializable接口,然后查看是否无法将依赖属性injecttor的代码移动到Initialize()的实现中。 Ninject保证在调用Initialize之前完成所有构造函数注入和原子注入。