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 MyServiceSuggestions:
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;
}
}
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>();
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.