visual valid name method example documentacion comment comentarios c# ninject ninject.web.mvc

c# - name - NinjectDependencyResolver falla al enlazar ModelValidatorProvider



summary param name c# (6)

Estoy desarrollando un ASP.NET Web Api 2.2 con C #, .NET Framework 4.5.1.

Después de actualizar mi Web.Api a Ninject 3.2.0 me sale este error:

Error activating ModelValidatorProvider using binding from ModelValidatorProvider to NinjectDefaultModelValidatorProvider A cyclical dependency was detected between the constructors of two services. Activation path: 3) Injection of dependency ModelValidatorProvider into parameter defaultModelValidatorProviders of constructor of type DefaultModelValidatorProviders 2) Injection of dependency DefaultModelValidatorProviders into parameter defaultModelValidatorProviders of constructor of type NinjectDefaultModelValidatorProvider 1) Request for ModelValidatorProvider Suggestions: 1) Ensure that you have not declared a dependency for ModelValidatorProvider on any implementations of the service. 2) Consider combining the services into a single one to remove the cycle. 3) Use property injection instead of constructor injection, and implement IInitializable if you need initialization logic to be run after property values have been injected.

Obtengo la excepción en NinjectWebCommon :

public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); /// <summary> /// Starts the application /// </summary> public static void Start() { DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); bootstrapper.Initialize(CreateKernel); } /// <summary> /// Stops the application. /// </summary> public static void Stop() { bootstrapper.ShutDown(); } /// <summary> /// Creates the kernel that will manage your application. /// </summary> /// <returns>The created kernel.</returns> private static IKernel CreateKernel() { var kernel = new StandardKernel(); try { kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); RegisterServices(kernel); return kernel; } catch { kernel.Dispose(); throw; } } /// <summary> /// Load your modules or register your services here! /// </summary> /// <param name="kernel">The kernel.</param> private static void RegisterServices(IKernel kernel) { var containerConfigurator = new NinjectConfigurator(); containerConfigurator.Configure(kernel); } }

Clase NinjectDependencyResolver :

using Ninject; using System; using System.Collections.Generic; using System.Web.Http.Dependencies; namespace Matt.SocialNetwork.Web.Common { public class NinjectDependencyResolver : IDependencyResolver { private readonly IKernel _container; public IKernel Container { get { return _container; } } public NinjectDependencyResolver(IKernel container) { _container = container; } public object GetService(Type serviceType) { return _container.TryGet(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { return _container.GetAll(serviceType); } public IDependencyScope BeginScope() { return this; } public void Dispose() { // noop } } }

Clase NinjectConfigurator :

public class NinjectConfigurator { public void Configure(IKernel container) { // Add all bindings/dependencies AddBindings(container); // Use the container and our NinjectDependencyResolver as // application''s resolver var resolver = new NinjectDependencyResolver(container); GlobalConfiguration.Configuration.DependencyResolver = resolver; } // Omitted for brevity. }

Lo extraño es que compila y funciona perfectamente, pero después de la actualización no funciona.

He cambiado esta public class NinjectDependencyResolver : IDependencyResolver, System.Web.Mvc.IDependencyResolver pero todavía no funciona.

¿Alguna idea?

ACTUALIZAR

Debugging veo que la excepción se produce en NinjectDependencyResolver aquí:

public IEnumerable<object> GetServices(Type serviceType) { return _container.GetAll(serviceType); }

Se ejecuta dos veces. El primer serviceType es IFilterProvider y el segundo serviceType es ModelValidatorProvider , y después de eso obtengo la excepción.

Estos son los paquetes de Ninject que estoy usando:

<package id="Ninject" version="3.2.2.0" targetFramework="net451" /> <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net45" /> <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net451" /> <package id="Ninject.Web.Common.WebHost" version="3.2.3.0" targetFramework="net451" /> <package id="Ninject.Web.WebApi" version="3.2.2.0" targetFramework="net451" />

La versión anterior para estos ensamblajes era:

<package id="Ninject" version="3.2.2.0" targetFramework="net45" /> <package id="Ninject.MVC5" version="3.2.1.0" targetFramework="net45" /> <package id="Ninject.Web.Common" version="3.2.2.0" targetFramework="net451" /> <package id="Ninject.Web.Common.WebHost" version="3.2.0.0" targetFramework="net45" /> <package id="Ninject.Web.WebApi" version="3.2.0.0" targetFramework="net451" />

SEGUNDA ACTUALIZACIÓN

He encontrado que el problema está en esta clase:

public static class WebContainerManager { public static IKernel GetContainer() { var resolver = GlobalConfiguration.Configuration.DependencyResolver as NinjectDependencyResolver; if (resolver != null) { return resolver.Container; } throw new InvalidOperationException("NinjectDependencyResolver not being used as the MVC dependency resolver"); } public static T Get<T>() { return GetContainer().Get<T>(); } }

Puse Dependency Resolver aquí:

public class NinjectConfigurator { /// <summary> /// Entry method used by caller to configure the given /// container with all of this application''s /// dependencies. Also configures the container as this /// application''s dependency resolver. /// </summary> public void Configure(IKernel container) { // Add all bindings/dependencies AddBindings(container); // Use the container and our NinjectDependencyResolver as // application''s resolver var resolver = new NinjectDependencyResolver(container); GlobalConfiguration.Configuration.DependencyResolver = resolver; }

Y uso WebContainerManager en una clase que hereda de ExceptionFilterAttribute :

public class UnhandledExceptionFilter : ExceptionFilterAttribute { private readonly IExceptionLogHelper excepLogHelper; public UnhandledExceptionFilter() : this(WebContainerManager.Get<IExceptionLogHelper>()) {} public UnhandledExceptionFilter(IExceptionLogHelper exceptionLogHelper) { this.excepLogHelper = exceptionLogHelper; } public override void OnException(HttpActionExecutedContext actionExecutedContext) { this.excepLogHelper.LogException(actionExecutedContext); } }

Por lo tanto, si WebContainerManager no obtengo ese ciclo.


En mi caso, funcionaba bien en el contexto de Owin Selfhost, pero no cuando estaba alojado en IIS. Mi solución fue eliminar todos los conjuntos relacionados con Ninject de los paquetes de nuget, excepto Ninject.

Luego escribí mi propia clase DependencyResolver, siéntase libre de dejar mejoras en los comentarios.

public class NinjectDepsolver : IDependencyResolver { private IKernel _kernel; public NinjectDepsolver(IKernel kernel) { _kernel = kernel; } public void Dispose() { _kernel = null; } public object GetService(Type serviceType) => _kernel.TryGet(serviceType); public IEnumerable<object> GetServices(Type serviceType) => _kernel.GetAll(serviceType).ToArray(); public IDependencyScope BeginScope() => new DepScope(this); class DepScope : IDependencyScope { private NinjectDepsolver _depsolver; public DepScope(NinjectDepsolver depsolver) { _depsolver = depsolver; } public void Dispose() { _depsolver = null; } public object GetService(Type serviceType) => _depsolver.GetService(serviceType); public IEnumerable<object> GetServices(Type serviceType) => _depsolver.GetServices(serviceType); } }

Y luego en su método de configuración de Owin:

var kernel = new StandardKernel(); kernel.Load(<your module classes>); var httpConfig = new HttpConfiguration(); var httpConfig.DependencyResolver = new NinjectDepsolver(kernel); var httpConfig.MapHttpAttributeRoutes(); app.UseWebApi(httpConfig);


Estaba teniendo muchos problemas con la inicialización de WebApi2 y Ninject después de actualizar los paquetes de Ninject (incluso desinstalar y eliminar los anteriores).

Específicamente en su caso yo eliminaría estas líneas de código:

// Use the container and our NinjectDependencyResolver as // application''s resolver var resolver = new NinjectDependencyResolver(container); GlobalConfiguration.Configuration.DependencyResolver = resolver;

ya que probablemente sean la causa del error (las bibliotecas NinjectWebCommon.cs y Ninject se ocupan de inicializar el resolvedor de dependencias ahora).

Para otros por ahí que siguieron una ruta de actualización similar a mí. Lo que funcionó para mí fue lo siguiente:

  • Elimine el antiguo código de inicialización de DependencyResolver (para mí, esto causó el error específico que menciona como en las versiones anteriores de Ninject / WebApi2, al poner estas líneas en el método de Registro () de WebApiConfig. es el caso):

    var kernel = new StandardKernel(); config.DependencyResolver = new NinjectDependencyResolver(kernel);

  • Instale el paquete Ninject.Web.WebApi.WebHost. Esto instaló el archivo NinjectWebCommon.cs. Para mí, el solo hecho de tener Ninject.Web.WebApi y sus dependencias no creó este archivo.

Mis paquetes Ninject instalados y en funcionamiento para referencia:

<package id="Ninject" version="3.2.2.0" targetFramework="net452" /> <package id="Ninject.Web.Common" version="3.2.3.0" targetFramework="net452" /> <package id="Ninject.Web.Common.WebHost" version="3.2.0.0" targetFramework="net452" /> <package id="Ninject.Web.WebApi" version="3.2.3.0" targetFramework="net452" /> <package id="Ninject.Web.WebApi.WebHost" version="3.2.3.0" targetFramework="net452" />


Esto es lo que funcionó para mí.

uninstall-package Ninject.Web.WebApi.WebHost

El comando anterior desinstaló la versión ''Ninject.Web.WebApi.WebHost 3.2.4.0'' y el error desapareció.

Solo reconfirmo, he instalado el mismo paquete usando el comando

install-package Ninject.Web.WebApi.WebHost

y el comando instaló el paquete ''Ninject.Web.WebApi.WebHost 3.2.4.0'' y el error volvió a aparecer.


La dependencia cíclica se encuentra entre las clases "NinjectDefaultModelValidatorProvider" y "DefaultModelValidatorProviders". Simplemente agregue un enlace para "DefaultModelValidatorProviders" en su inicio, como a continuación:

_kernel.Bind<DefaultModelValidatorProviders>().ToConstant(new DefaultModelValidatorProviders(config.Services.GetServices(typeof (ModelValidatorProvider)).Cast<ModelValidatorProvider>()));


Asegúrese de que cualquier antiguo Ninject o Ninject.Web.Common.* no estén presentes en su carpeta bin.

Tuve el mismo problema en mi solución después de haber desinstalado Ninject.Web.Common , Ninject.Web.Common.WebHost , Ninject.Web.WebApi y Ninject.MVC5 de Nuget e instalé WebApiContrib.IoC.Ninject para usar GlobalConfiguration.Configuration.DependencyResolver como en su ejemplo. Mantuve la versión de Ninject que ya tenía instalada (que en realidad era 3.2.2 ).

El error no apareció cuando hice mis cambios por primera vez. Sin embargo, después de moverme desde unas pocas ramas de git y volver a mi trabajo actual, vi el error. El código que había funcionado bien la semana pasada ahora estaba arrojando el mismo error exacto.

Parece que mi carpeta bin tenía referencias a los antiguos paquetes Ninject.* Que había eliminado. Al eliminar esos archivos, mi proyecto funcionó como se esperaba.


var _surveyBusiness = _kernel.Get<ISurveyBusiness>(); _surveyBusiness.SomeFunc(user.CompanyId, user.UserId);

Esto está funcionando también.