2010-05-26 15 views
20

Sono nuovo in StructureMap. Ho scaricato e sono utilizzando la versione 2.6.1.0. Continuo a ricevere il seguito errore:StructureMap Codice eccezione: 202 Nessuna istanza predefinita definita per PluginFamily

StructureMap Exception Code: 202 No Default Instance defined for PluginFamily Company.ProjectCore.Core.IConfiguration, Company.ProjectCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

mio Global.asax.cs assomiglia:

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

} 

ho cambiato da ObjectFactory.Initialize a "nuovo contenitore" per eseguire il debug. Quando si passa tramite il metodo AssertConfigurationIsValid(), Cache opere ma EmailService fallisce al metodo GetInstance nella seguente linea:

[Pluggable("Default")] 
public class EmailService : IEmailService 

private readonly IConfiguration _configuration; 

public EmailService() 
{ 
    _configuration = ObjectFactory.GetInstance<IConfiguration>(); 
} 

Se rimuovo IEmailService, lo stesso errore 202 è lanciato IUserSession.

Devo aggiungere qualcos'altro in Application_Start o nei miei file di classe?

Grazie in anticipo ...

+0

A quale livello di applicazione appartiene StructureMap? Livello dell'interfaccia utente, dell'azienda o dei dati? – Rod

risposta

18

Questo problema veniva risolto sostituendo ObjectFactory.Initialize con ObjectFactory.Configure e aggiungendo le assemblee nel mio progetto:

ObjectFactory.Configure(x => 
{ 
    x.Scan(scan => 
    { 
     scan.LookForRegistries(); 
     scan.Assembly("MyAssembly"); 
     scan.Assembly("MyAssembly"); 
    }); 
}); 
+0

Grazie per quello. Funziona bene. Puoi contrassegnarlo come risposta per favore. Perché è facile per il lettore. – Saghar

6

Dov'è la tua bootstrap per la classe concreta IConfiguration?

Ie:

x.For<IConfiguration>().Use<Configuration>(); 
+0

Sì. Ho provato ad aggiungerlo e non sembra avere importanza. Quando è lì, non viene mai colpito. Quando commento tutte le altre classi, il compilatore agisce come se non fosse lì e va semplicemente al prossimo blocco di codice. Inoltre, come ho detto prima, se estraggo IEmailService (dove viene chiamato IConfiguration) viene chiamata la prossima interfaccia - IUserSession e ricevo di nuovo l'errore 202. Quindi, non penso che la risposta al mio problema è come sto facendo il boot di IConfiguration. –

+2

La risposta al tuo problema è sicuramente il modo in cui stai eseguendo il bootstrap. Errore StructureMap 202 significa che non hai detto a StructureMap come risolvere una dipendenza (nel tuo bootstrap). In questo caso specifico, non hai mai detto come risolvere un IConfiguration. –

11

mi è stato sempre lo stesso messaggio di errore, ma per un motivo diverso . Ho avuto un Foo classe che ha definito due costruttori in questo modo:

public class Foo : IFoo 
{ 
    private Bar _bar; 

    public Foo() 
    { 
     _bar = new Bar(); 
    } 

    public Foo(Bar bar) 
    { 
     _bar = bar; 
    } 
} 

e la mia configurazione StructureMap era in questo modo:

For<IFoo>.Use<Foo>(); 

ho continuato a ottenere un messaggio di errore come

202 No Default Instance defined for Bar

Il problema era che StructureMap stava cercando di costruire un Foo usando il costruttore che accetta un parametro, invece di usare il costruttore di default senza parametri. Ho risolto utilizzando la risposta in How to define a default constructor by code using StructureMap? in questo modo:

For<IFoo>.Use(() => new Foo()); 
2

stavo vedendo lo stesso errore. Nel mio caso, ho avuto un refuso nel nome dell'implementazione, quindi i nomi dell'interfaccia e dell'implementazione non corrispondevano.

public class FooTypo : IFoo 

Dove avrei dovuto:

public class Foo : IFoo 
0

Quando ho ricevuto questo errore è stato perché ho dimenticato di segnare la mia classe public. Così semplice

0

Ho riscontrato questo problema anche quando utilizzavo Visual Studio 2015 con NCrunch. Tutto ciò che dovete fare è alternare un'opzione a true nella voce di menu di configurazione in NCrunch.Il passaggio da inizializzare a configurare non ha funzionato per me.

L'opzione è in Impostazioni del torso, è chiamato 'Copia assemblee riferimento a un'area di lavoro'

1

Un'altra cosa da cercare è quello di assicurarsi che la dipendenza (classe) che si sta iniettando è pubblico . Se la classe è interna, può causare questo problema.

Problemi correlati