Ninject WithConstructorArgument: Aucune liaison correspondante n'est disponible et le type n'est pas auto-lisible
Ma compréhension de WithConstructorArgument est probablement erronée, car celui-ci ne fonctionne pas:
J'ai un service, permet de l'appeler MyService, dont le constructeur prend plusieurs objets, et un paramètre de chaîne appelée testEmail. Pour ce paramètre de chaîne, j'ai ajouté ce qui suit Ninject de liaison:
string testEmail = "[email protected]";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);
Cependant, lors de l'exécution de la ligne suivante de code, j'obtiens une exception:
var myService = kernel.Get<MyService>();
Ici est l'exception-je obtenir:
Erreur lors de l'activation de la chaîne de l'Absence de correspondance liaisons sont disponibles, et la
le type n'est pas auto-liables. Chemin d'Activation:
2) l'Injection de
la dépendance de la chaîne en paramètre testEmail de constructeur de type
MyService
1) Demande de MyServiceSuggestions:
1) vérifiez que vous avez défini une liaison pour la chaîne.
2) Si la liaison a été définie dans un module, vérifiez que le module a
été chargé dans le noyau.
3) s'Assurer que vous n'avez pas accidentellement
créé plus d'un noyau.
4) Si vous utilisez le constructeur
arguments, s'assurer que le nom du paramètre correspond à l'constructeurs
nom du paramètre.
5) Si vous utilisez le module automatique de chargement, s'assurer
le chemin de recherche et les filtres sont corrects.
Ce que je fais mal?
Mise à JOUR:
Ici est la MyService constructeur:
[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 norme liaisons pour tous les paramètre du constructeur de types. Seulement 'string' a pas de liaison, et HttpContextBase a une liaison qui est un peu différent:
kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(new HttpContext(new MyHttpRequest("", "", "", null, new StringWriter()))));
et MyHttpRequest est définie 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;
}
}
source d'informationauteur Jean-François Beauchamp
Vous devez vous connecter pour publier un commentaire.
Avec l'énoncé:
Vous essayez de la résoudre
MyService
et parce que leMyService
type n'est pas enregistré dans votre noyau Ninject va la traiter comme une auto lié type.Il n'est donc pas utiliser votre
WithConstructorArgument
pour résoudre le"testEmail"
car il sera utilisé uniquement avec lesBind<IMyService>()
c'est pourquoi vous obtenez une exception.Donc, si vous avez enregistré votre
MyService
avec:Alors vous devez le résoudre grâce au régime enregistré d'interface (
IMyService
):Tout nemesv a la bonne réponse, j'ai couru dans le même message d'erreur et la solution pour moi a été un voyou DLL dans mon /bin. J'avais refait et supprimé/déplacé certaines classes, qui ont toujours été présents dans ma vieille DLL. Solution retirez l'ancienne DLL.