Использование Ninject в качестве IoC для EasyNetQ

я использую библиотеку EasyNetQ в своем проекте, и я хотел бы использовать Ninject в качестве контейнера IoC для компонентов EasyNetQ.

Я создал собственный регистратор, чтобы регистрировать что-либо из 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.
[...]

Я использую этот пакет неправильно? Есть ли решение?

Спасибо!


person Ganto    schedule 15.04.2014    source источник


Ответы (1)


Как сказано в исключении, для IEasyNetQLogger есть две привязки.

Я предполагаю, что используемое вами расширение ninject уже связывает файл IEasyNetQLogger.

Вы можете использовать Rebind (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(..) для замены привязки (что необходимо сделать после создания исходной привязки!) или посмотреть, как она должна работать.


Конечно, вы также можете просто пропустить привязку, поскольку вы создали ее только для «регистратора ничего не регистрировать»...

person BatteryBackupUnit    schedule 16.04.2014
comment
Привет, BatteryBackupUnit, я пробовал с Rebind, но все еще получаю сообщение об ошибке. Если я ничего не привязываю к регистратору EasyNetQ, продолжайте использовать его по умолчанию. Это похоже на то, что оператор CreateBus все еще связывает свои собственные компоненты после нинектных. В тесте Estension есть странный комментарий link: Ninject doesn't allow more than one registration of a service, it throws an exception Кажется, это все еще открытый вопрос. - person Ganto; 16.04.2014
comment
В этом случае EasyNetQ создает привязку после того, как вы вызвали повторную привязку. Вам нужно выяснить, как должна быть настроена регистрация EasyNetQ. Вам нужно выяснить, кто звонит NinjectAdapter.Register<TService>(Func<.... Возможно, вы также должны каким-то образом настроить EasyNetQ, а не ninject, для ведения журнала. Попробуйте удалить привязку и использовать IResolutionRoot.Get<IEasyNetQLogger> — посмотрите, что она возвращает? - person BatteryBackupUnit; 16.04.2014