web-dev-qa-db-fra.com

Ninject WithConstructorArgument: aucune liaison correspondante n'est disponible et le type n'est pas auto-lié

Ma compréhension de WithConstructorArgument est probablement erronée, car ce qui suit ne fonctionne pas:

J'ai un service, appelons-le MyService, dont le constructeur prend plusieurs objets, et un paramètre de chaîne appelé testEmail. Pour ce paramètre de chaîne, j'ai ajouté la liaison Ninject suivante:

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

Cependant, lors de l'exécution de la ligne de code suivante, j'obtiens une exception:

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

Voici l'exception que je reçois:

Erreur lors de l'activation de la chaîne Aucune liaison correspondante n'est disponible et le type n'est pas auto-lié. Chemin d'activation:
2) Injection de chaîne de dépendance dans le paramètre testEmail du constructeur de type MyService
1) Demande de MyService

Suggestions:
1) Assurez-vous que vous avez défini une liaison pour la chaîne.
2) Si la liaison a été définie dans un module, assurez-vous que le module a été chargé dans le noyau.
3) Assurez-vous que vous n'avez pas créé accidentellement plus d'un noyau.
4) Si vous utilisez des arguments de constructeur, assurez-vous que le nom du paramètre correspond au nom du paramètre du constructeur.
5) Si vous utilisez le chargement automatique du module, assurez-vous que le chemin de recherche et les filtres sont corrects.

Qu'est-ce que je fais mal ici?

MISE À JOUR :

Voici le constructeur 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;
}

J'ai des liaisons standard pour tous les types de paramètres de constructeur. Seule 'chaîne' n'a pas de liaison, et HttpContextBase a une liaison qui est un peu différente:

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

et MyHttpRequest est défini comme suit:

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;
    }
}
20

Avec la déclaration:

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

Vous essayez la résolution MyService et parce que le type MyService n'est pas enregistré dans votre noyau, Ninject le traitera comme un type auto-lié.

Il n'utilisera donc pas votre WithConstructorArgument pour résoudre le "testEmail" Car il ne sera utilisé qu'avec Bind<IMyService>() c'est pourquoi vous obtenez l'exception.

Donc, si vous avez enregistré votre MyService avec:

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

Ensuite, vous devez le résoudre via l'interface enregistrée (IMyService):

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

Alors que nemesv a la bonne réponse, je suis tombé sur la même erreur et la solution pour moi était un voyou DLL dans mon/bin. J'avais refactorisé et supprimé/déplacé certaines classes qui étaient toujours présentes dans mon ancienne DLL Solution- supprimer l'ancienne DLL.

2
jrap