使用Ninject作为EasyNetQ的IoC

时间:2014-04-15 16:21:39

标签: ninject easynetq

我在我的项目中使用EasyNetQ库,我想将Ninject用作EasyNetQ组件的IoC容器。

我创建了一个自定义记录器,以便从EasyNetQ中记录任何内容:

public class LogNothingLogger : IEasyNetQLogger
{
    ...
}

然后在我的主要功能中使用Ninject扩展:

public class Program
    {
        static void Main(string[] args)
        {
            // Container creation and custom logger registration
            IKernel cointainer = new StandardKernel();
            cointainer.Bind<IEasyNetQLogger>().To<LogNothingLogger>();

            // Register Ninject as IoC Container for EasyNetQ
            cointainer.RegisterAsEasyNetQContainerFactory();

            // Create bus
            using (IBus bus = RabbitHutch.CreateBus("host=localhost"))
            {
                // Do something with bus...
            }
        }
    }

但我得到以下例外:

Ninject.ActivationException was unhandled
More than one matching bindings are available.
Matching bindings:
  1) binding from IEasyNetQLogger to LogNothingLogger
  2) binding from IEasyNetQLogger to method
Activation path:
  2) Injection of dependency IEasyNetQLogger into parameter logger of constructor of type RabbitBus
  1) Request for RabbitBus

Suggestions:
  1) Ensure that you have defined a binding for IEasyNetQLogger only once.
[...]

我是否以错误的方式使用此套餐?有没有解决方案?

谢谢!

1 个答案:

答案 0 :(得分:1)

正如例外所述,IEasyNetQLogger有两个绑定。

我认为你正在使用的ninject扩展已经绑定了IEasyNetQLogger

您可以使用重新绑定(IBindingRoot.Rebind<IEasyNetQLogger>())覆盖IEasyNetQLogger的任何现有绑定。

但我还建议你研究为什么扩展已经在创建一个绑定以及它应该如何被使用。

您使用的扩展名是什么?

编辑:我瞥了一眼https://github.com/mikehadlow/EasyNetQ/tree/master/Source/EasyNetQ.DI.Ninject 我没有找到IEasyNetQLogger的任何约束力。您确定没有定义额外的IBindingRoot.Bind<IEasyNetQLogger>().ToMethod(...)绑定吗?

也可能是NinjectAdapter.Register<IEasyNetQLogger>(Func<IEasyNetQLogger> ...)

如果您还没有这样做,那么EasyNetQ已经在NinjectAdapter.Register<IEasyNetQLogger>(Func<IEasyNetQLogger> ...)注册了一个记录器。

和以前一样,您可以使用Rebind(..)替换绑定(必须在创建原始绑定后执行!)或查看它应该如何工作。


当然,您可能只想跳过绑定,因为您只为“log nothing logger”创建了一个...