使用ninject 2执行构造函数注入和属性注入的顺序

时间:2010-11-27 09:35:55

标签: module ioc-container ninject ninject-2

我正在我的(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());
        }
    }

感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

在构造函数注入之前,没有IoC框架能够进行属性注入。 IoC框架只能在手动编写的工厂中执行相同的操作。在创建对象之前,您无法访问该对象的属性吗?所以不能是IoC框架。

基本上你有两种选择。

  1. 构造函数注入(首选)
  2. 执行方法注入并在方法中执行构造函数。

    [Inject]
    public void Initialize(ILog log) { ... } 
    

答案 1 :(得分:0)

我还建议第三种选择。您可以实现Ninject的IInitializable接口,然后查看是否无法将依赖属性injecttor的代码移动到Initialize()的实现中。 Ninject保证在调用Initialize之前完成所有构造函数注入和原子注入。