c# exception-handling dependency-injection ninject ninject-2

c# - ninject github



Ninject WithConstructorArgument: No hay enlaces coincidentes disponibles, y el tipo no es auto-enlazable (2)

Mi comprensión de WithConstructorArgument es probablemente errónea, porque lo siguiente no funciona:

Tengo un servicio, llamémoslo MyService, cuyo constructor está tomando varios objetos, y un parámetro de cadena llamado testEmail. Para este parámetro de cadena, agregué el siguiente enlace de Ninject:

string testEmail = "[email protected]"; kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);

Sin embargo, al ejecutar la siguiente línea de código, obtengo una excepción:

var myService = kernel.Get<MyService>();

Aquí está la excepción que recibo:

Error al activar la cadena No hay enlaces coincidentes disponibles, y el tipo no es autoenlazable. Ruta de activación:
2) Inyección de la cadena de dependencia en el parámetro testEmail del constructor de tipo MyService
1) Solicitud de MyService

Sugerencias:
1) Asegúrese de haber definido un enlace para la cadena.
2) Si el enlace se definió en un módulo, asegúrese de que el módulo se haya cargado en el kernel.
3) Asegúrese de que no haya creado accidentalmente más de un kernel.
4) Si está utilizando argumentos de constructor, asegúrese de que el nombre del parámetro coincida con el nombre del parámetro del constructor.
5) Si está utilizando la carga automática de módulos, asegúrese de que la ruta de búsqueda y los filtros sean correctos.

¿Qué estoy haciendo mal aquí?

ACTUALIZACIÓN :

Aquí está el constructor MyService:

[Ninject.Inject] public MyService(IMyRepository myRepository, IMyEventService myEventService, IUnitOfWork unitOfWork, ILoggingService log, IEmailService emailService, IConfigurationManager config, HttpContextBase httpContext, string testEmail) { this.myRepository = myRepository; this.myEventService = myEventService; this.unitOfWork = unitOfWork; this.log = log; this.emailService = emailService; this.config = config; this.httpContext = httpContext; this.testEmail = testEmail; }

Tengo enlaces estándar para todos los tipos de parámetros del constructor. Solo la ''cadena'' no tiene enlace, y HttpContextBase tiene un enlace que es un poco diferente:

kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(new HttpContext(new MyHttpRequest("", "", "", null, new StringWriter()))));

y MyHttpRequest se define de la siguiente manera:

public class MyHttpRequest : SimpleWorkerRequest { public string UserHostAddress; public string RawUrl; public MyHttpRequest(string appVirtualDir, string appPhysicalDir, string page, string query, TextWriter output) : base(appVirtualDir, appPhysicalDir, page, query, output) { this.UserHostAddress = "127.0.0.1"; this.RawUrl = null; } }


Con la declaración:

var myService = kernel.Get<MyService>();

Está intentando resolver MyService y, como el tipo MyService no está registrado en su núcleo, Ninject lo tratará como un tipo de enlace automático.

Por lo tanto, no utilizará WithConstructorArgument para resolver el "testEmail" porque solo se usará con Bind<IMyService>() por lo que está obteniendo la excepción.

Así que si has registrado tu MyService con:

string testEmail = "[email protected]"; kernel.Bind<IMyService>().To<MyService>() .WithConstructorArgument("testEmail", testEmail);

Entonces debes resolverlo a través de la interfaz registrada ( IMyService ):

var myService = kernel.Get<IMyService>();


Si bien nemesv tiene la respuesta correcta, me encontré con el mismo error y la solución para mí fue una DLL maliciosa en mi / bin. He refactorizado y eliminado / movido algunas clases que todavía estaban presentes en mi DLL anterior. Solución: eliminar el archivo DLL anterior.