2010-05-26 6 views
20

Soy nuevo en StructureMap. Lo he descargado y estoy usando la versión 2.6.1.0. Sigo recibiendo el siguiente error :Código de excepción de StructureMap: 202 Ninguna instancia predeterminada definida para 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

Mi Global.asax.cs parece:

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

} 

pasé de ObjectFactory.Initialize a "Contenedor nuevo" depurar. al desplazarse por el método AssertConfigurationIsValid(), Caché funciona, pero EmailService falla en el método GetInstance en la siguiente línea de :

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

private readonly IConfiguration _configuration; 

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

Si quito IEmailService, el mismo error 202 se lanza a IUserSession.

¿Debo agregar algo más en Application_Start o en los archivos de mi clase?

Gracias de antemano ...

+0

¿A qué capa de aplicación pertenece StructureMap? UI, Business o capa de datos? – Rod

Respuesta

18

Este problema se resolvió mediante la sustitución de ObjectFactory.Initialize con ObjectFactory.Configure y la adición de los montajes en mi proyecto:

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

Gracias por eso. Funciona bien ¿Puedes marcarlo como respuesta por favor? Porque es fácil para el lector. – Saghar

6

¿Dónde está su arranque de la clase concreta IConfiguration?

Es decir:

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

Sí ... intenté agregar eso y no parece importar. Cuando está allí, nunca es golpeado. Cuando comento todas las demás clases, el compilador actúa como si no estuviera allí y se dirige al siguiente bloque de código. Además, como señalé antes, si saco IEmailService (donde se llama IConfiguration) se llama a la siguiente interfaz, IUserSession, y aparece el error 202 nuevamente. Por lo tanto, no creo que la respuesta a mi problema sea cómo estoy iniciando IConfiguration. –

+2

La respuesta a su problema es sin duda la forma en que se inicia. El error 202 de StructureMap significa que no le ha explicado a StructureMap cómo resolver una dependencia (en su arranque). En este caso específico, nunca le dijo cómo resolver una IConfiguration. –

11

que estaba recibiendo el mismo mensaje de error, pero por una razón diferente . Yo tenía un Foo clase que define dos constructores de este modo:

public class Foo : IFoo 
{ 
    private Bar _bar; 

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

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

y mi configuración StructureMap era así:

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

seguí recibiendo un mensaje de error como

202 No Default Instance defined for Bar

El problema fue que StructureMap estaba tratando de construir un Foo utilizando el constructor que toma un parámetro, en lugar de usar el constructor predeterminado sin parámetros. Lo resuelto mediante la respuesta en How to define a default constructor by code using StructureMap? así:

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

que estaba viendo el mismo error. En mi caso, tuve un error tipográfico en el nombre de la implementación, por lo que los nombres de la interfaz y la implementación no coinciden.

public class FooTypo : IFoo 

donde debería haber tenido:

public class Foo : IFoo 
0

Cuando llegué a este error era porque se me olvidó marcar mi clase public. Así de simple.

0

También tuve este problema cuando estaba usando Visual Studio 2015 con NCrunch. Todo lo que tiene que hacer es alternar una opción al verdadero en la opción del menú de configuración en NCrunch.Cambiar la inicialización a la configuración no funcionó para mí.

La opción se encuentra en configuración de generación, se llama 'Copiar ensamblados de referencia al espacio de trabajo'

1

Otra cosa a buscar es asegurarse de que la dependencia (clase) que se inyecta es pública . Si la clase es interna, puede causar este problema.

Cuestiones relacionadas