Je suis nouveau sur StructureMap. J'ai téléchargé et suis En utilisant la version 2.6.1.0. Je continue à obtenir l'erreur ci-dessous :
Code d'exception StructureMap: 202 No Instance par défaut définie pour PluginFamily Company.ProjectCore.Core.IConfiguration, Company.ProjectCore, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null
Mon Global.asax.cs ressemble à:
protected void Application_Start(object sender, EventArgs e)
{
var container = new Container(x =>
{
x.For<ICache>().Use<Cache>();
x.For<IEmailService>().Use<EmailService>();
x.For<IUserSession>().Use<UserSession>();
x.For<IRedirector>().Use<Redirector>();
x.For<INavigation>().Use<Navigation>();
});
container.AssertConfigurationIsValid();
}
J'ai changé d'ObjectFactory.Initialize en "nouveau conteneur" pour déboguer. Lorsque vous parcourez la méthode AssertConfigurationIsValid (), Cacheworks mais EmailService échouent au niveau de la méthode GetInstance de la ligne Suivante:
[Pluggable("Default")]
public class EmailService : IEmailService
private readonly IConfiguration _configuration;
public EmailService()
{
_configuration = ObjectFactory.GetInstance<IConfiguration>();
}
Si je supprime IEmailService, la même erreur 202 est émise à IUserSession.
Devrais-je ajouter quelque chose d'autre dans Application_Start ou dans mes fichiers de classe?
Merci d'avance...
Ce problème a été résolu en remplaçant ObjectFactory.Initialize
par ObjectFactory.Configure
et en ajoutant les assemblys dans mon projet:
ObjectFactory.Configure(x =>
{
x.Scan(scan =>
{
scan.LookForRegistries();
scan.Assembly("MyAssembly");
scan.Assembly("MyAssembly");
});
});
Je recevais le même message d'erreur, mais pour une raison différente. J'ai eu une classe Foo qui a défini deux constructeurs comme suit:
public class Foo : IFoo
{
private Bar _bar;
public Foo()
{
_bar = new Bar();
}
public Foo(Bar bar)
{
_bar = bar;
}
}
et ma configuration StructureMap était comme suit:
For<IFoo>.Use<Foo>();
J'ai continué à recevoir un message d'erreur comme
202 Aucune instance par défaut définie pour la barre
Le problème était que StructureMap essayait de construire un Foo en utilisant le constructeur qui prend un paramètre au lieu d'utiliser le constructeur par défaut sans paramètre. Je l'ai résolu en utilisant la réponse dans Comment définir un constructeur par défaut avec du code en utilisant StructureMap? ainsi:
For<IFoo>.Use(() => new Foo());
Où en êtes-vous pour la classe concrète IConfiguration?
C'est à dire:
x.For<IConfiguration>().Use<Configuration>();
Une autre chose à rechercher est de s’assurer que la dépendance (classe) que vous injectez est public . Si la classe est interne, cela peut provoquer ce problème.
Je voyais la même erreur. Dans mon cas, j'avais une faute de frappe dans le nom de l'implémentation, donc les noms d'interface et d'implémentation ne correspondaient pas.
public class FooTypo : IFoo
Où j'aurais dû avoir:
public class Foo : IFoo
J'ai également rencontré ce problème lorsque j'utilisais Visual Studio 2015 avec NCrunch . Tout ce que vous avez à faire est de basculer une option sur true dans l'élément de menu de configuration sous NCrunch. Changer d'initialisation pour configurer n'a pas fonctionné pour moi.
L'option se trouve sous Paramètres de construction, elle s'appelle 'Copier les assemblys référencés dans un espace de travail'.
Lorsque j'ai eu cette erreur, c'est parce que j'ai oublié de marquer ma classe public
. C'est simple.