【问题标题】:Executing order of constructor injection and property injection using ninject 2使用ninject 2执行构造函数注入和属性注入的顺序
【发布时间】:2010-11-27 09:35:54
【问题描述】:

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

感谢所有帮助。

【问题讨论】:

  • context.getType() 应该是 context.Request.Target.Member.ReflectedType 顺便说一句。

标签: module ioc-container ninject ninject-2


【解决方案1】:

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

基本上你有两个选择。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2013-01-12
      相关资源
      最近更新 更多