Ninject: доступно более одной подходящей привязки - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть зависимость с параметрами конструктора. Когда я вызываю действие более 1 раза, оно показывает эту ошибку:

Ошибка активации IValidationPurchaseService Доступно несколько подходящих привязок. Путь активации:

1) Запрос на IValidationPurchaseService

Предложения:

1) Убедитесь, что вы указали привязку для IValidationPurchaseService только один раз.

        public ActionResult Detalhes(string regionUrl, string discountUrl, DetalhesModel detalhesModel)
        {
              var validationPurchaseDTO = new ValidationPurchaseDTO {...}

              KernelFactory.Kernel.Bind<IValidationPurchaseService>().To<ValidationPurchaseService>()
                                    .WithConstructorArgument("validationPurchaseDTO", validationPurchaseDTO)
                                    .WithConstructorArgument("confirmPayment", true);

              this.ValidationPurchaseService = KernelFactory.Kernel.Get<IValidationPurchaseService>();
              ...
        }

Ответы [ 2 ]

0 голосов
/ 23 ноября 2012

Ваш KernelFactory, вероятно, возвращает одно и то же ядро ​​(singleton) при каждом последующем обращении к контроллеру. Вот почему вы добавляете похожую привязку каждый раз, когда нажимаете на URL, который активирует этот контроллер. Так что это, вероятно, работает в первый раз и начинает давать сбой после второго раза.

0 голосов
/ 13 сентября 2011

Я не уверен, чего вы пытаетесь достичь с помощью приведенного вами кода. Ошибка возникает потому, что вы связываете один и тот же сервис более одного раза, поэтому, когда вы пытаетесь разрешить его, он не может выбрать одно (идентичное) связывание поверх другого. Это не то, как DI Контейнер должен работать. В вашем примере вы вообще не получаете преимущества от своего DI. Вы можете заменить свой код:

    KernelFactory.Kernel.Bind<IValidationPurchaseService>().To<ValidationPurchaseService>()
                                .WithConstructorArgument("validationPurchaseDTO", validationPurchaseDTO)
                                .WithConstructorArgument("confirmPayment", true);

    this.ValidationPurchaseService = KernelFactory.Kernel.Get<IValidationPurchaseService>();

С этим:

    this.ValidationPurchaseService = new ValidationPurchaseService(validationPurchaseDTO:validationPurchaseDTO, confirmPayment:true) 

Если бы вы могли объяснить, чего вы пытаетесь достичь, используя ninject в этом сценарии, сообщество сможет оказать дальнейшую помощь.

...