web-dev-qa-db-fra.com

Code d'exception StructureMap: 202 Aucune instance par défaut définie pour PluginFamily

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...

20
Peter

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");
    });
});
20
Peter

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());
11
user456814

Où en êtes-vous pour la classe concrète IConfiguration?

C'est à dire:

x.For<IConfiguration>().Use<Configuration>();
5
RPM1984

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.

2
chandler

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
2

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'.

0
Vishav Premlall

Lorsque j'ai eu cette erreur, c'est parce que j'ai oublié de marquer ma classe public. C'est simple.

0
ErikE