Non riesco a far funzionare Ninject.Extensions.Conventions

Ho cercato di ottenere il servizio Ninject.Extensions.Convention per (Ninject 3+) funzionante, senza fortuna. L’ho ridotto a un’app di console di esempio trovata e non riesco nemmeno a capirlo. Ecco cosa ho:

class Program { static void Main(string[] args) { var kernel = new StandardKernel(); kernel.Bind(x => x .FromThisAssembly() .SelectAllClasses() .BindAllInterfaces()); var output = kernel.Get(); output.HelloWorld(); var service = kernel.Get(); service.OutputToConsole(); Console.ReadLine(); } public interface IConsoleOutput { void HelloWorld(); } public class ConsoleOutput : IConsoleOutput { public void HelloWorld() { Console.WriteLine("Hello world!"); } } public class Service { private readonly IConsoleOutput _output; public Service(IConsoleOutput output) { _output = output; } public void OutputToConsole() { _output.HelloWorld(); } } } 

Ho anche provato varie combo di FromAssembliesMatching , SelectAllTypes , BindDefaultInterfaces , ecc. Tutto gira l’errore che si triggers. Non sono disponibili associazioni corrispondenti e il tipo non è autoindicabile.

Solo per sanità mentale, se faccio un legame manuale con:

 kernel.Bind().To(); 

Tutto funziona bene. Quindi chiaramente mi manca qualcosa.

È causato, come suggerito da Sam, dai tipi che non sono pubblici. Sono tipi interni della class “Programma” non pubblica.

Rendi pubblico il programma o aggiungi .IncludingNonPublicTypes() :

 kernel.Bind(x => x .FromThisAssembly() .IncludingNonPublicTypes() .SelectAllClasses() .BindAllInterfaces()); 

(Ho verificato che funziona, e il tuo codice non lo fa).

Ed ecco la tua fonte ufficiale: https://github.com/ninject/ninject.extensions.conventions/blob/master/src/Ninject.Extensions.Conventions.Test/IntegrationTests/NonPublicTypesTests.cs

Nota: nelle versioni precedenti di Ninject questo metodo era chiamato IncludeNonePublicTypes (None vs Non).