2010-02-18 6 views
5

tengo una clase SysMsgManager definido en el proyecto CoreService de la siguiente manera:StructureMap: Sin instancia predeterminada definida para PluginFamily

public class SysMsgManager 
{ 
    private ISysMsgRepository _SysMsgRepository; 

    public SysMsgManager() 
    { 
     _SysMsgRepository = ObjectFactory.GetInstance<ISysMsgRepository>(); 
    } 

    .... 
} 

En mi proyecto DataAccess he interfaz 'ISysMsgRepository' y dos implementaciones concretas definidas de la siguiente manera:

namespace DataAccess.Repository 
{ 
    [Pluggable("Default")] 
    public class SysMsgRepository : ISysMsgRepository 
    { 
     ... 
    } 
} 

namespace DataAccess.Repository 
{ 
    [Pluggable("Stub")] 
    public class SysMsgRepository_Test : ISysMsgRepository 
    { 
     ... 
    } 
} 

y esto es lo que tengo en mi archivo StructureMap.config

<StructureMap> 

<Assembly Name="CoreService" /> 
<Assembly Name="DataAccess" /> 

<PluginFamily 
    Assembly="DataAccess" 
    Type="DataAccess.Repository.ISysMsgRepository" 
    DefaultKey="Default" /> 

</StructureMap> 

Cuando trato de ejecutar mi aplicación, tengo el siguiente error:

StructureMap Código de excepción: 202 \ nNo instancia predeterminada definida para PluginFamily DataAccess.Repository.ISysMsgRepository, DataAccess, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

¿Alguien me puede ayudar a resolver este problema? ¡Gracias!

+0

Sé que esto no es la solución a este problema en particular, sino de las clases de seguro son soluciones públicas este error también – Nick

Respuesta

8

Lamentablemente, tengo poca familiaridad con la configuración de StructureMap a través de Xml. Déjame mostrarte cómo se hace usando C#.

var container = new Container(config=> 
{ 
    config.For<ISysMsgRepository>().Use<SysMsgRepository>(); 
}); 

Parece que está utilizando la convención de nomenclatura estándar para las interfaces y clases (solo viradas un I en la parte frontal del nombre de la clase). Si lo hace para todos sus tipos, puede configurar su contenedor de la siguiente manera:

var container = new Container(config=> 
{ 
    config.Scan(scan => 
    { 
     scan.TheCallingAssembly(); 
     scan.WithDefaultConventions(); 
    }); 
}); 

Espero que esto ayude. Es mucho más fácil configurar su contenedor utilizando código en lugar de Xml. Darle una oportunidad. Serás un converso

+0

He añadido siguiente código para SysMsgManager pública() contenedor var = Contenedor nuevo (config => { config.For (). Utilice (); }); _SysMsgRepository = ObjectFactory.GetInstance (); todavía tiene el mismo error. – sean717

+0

¿Puede enviarme pegar su código de prueba? – KevM

+0

Gracias por su ayuda. Termino haciendo que todo funcione en CastleWindsor. Creo que en un punto lo hago funcionar con el código que publicaste. Pero aún quiero tener la configuración a través de XML. – sean717

Cuestiones relacionadas