1

我正在我的(WCF)项目中加载一个 ninject 模块,并希望使用自定义提供程序在我的模块中连接 log4net。我使用提供程序的原因是 GetLogger 方法需要通过发生注入的类。如果这不是这样做的方法,请告诉我,我是 Ninject 的新手。(顺便说一句,Context.getType() 不正确,我在执行此操作时遇到了一些麻烦。)

主要问题是我的类中的 ILog 变量在构造函数执行后被初始化,但我希望能够在构造函数中使用日志记录。我还使用 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());
        }
    }

感谢所有帮助。

4

2 回答 2

2

没有任何 IoC 框架能够在构造函数注入之前进行属性注入。IoC 框架只能做您在手动编写的工厂中可以做的事情。在工厂创建对象之前,您不能访问它的属性吗?IoC 框架也不能。

基本上你有两个选择。

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

    [Inject]
    public void Initialize(ILog log) { ... } 
    
于 2010-11-27T22:42:20.490 回答
0

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

于 2011-11-11T23:46:45.880 回答