2011-01-30 8 views
15

Tengo un problema al insertar una instancia en structuremap para mis pruebas.StructureMap no es posible utilizar la instancia inyectada para la inyección de setter

Mi gráfico de objetos se parece a esto

internal class ConfigurationManager : IConfigurationManager : IManager 
{ 
    public ISomeManager SomeManager { get; set; } 
} 

internal class SomeManager : ISomeManager : IManager 
{ 
    public IConfigurationManager ConfigurationManager { get; set; } 
} 

1) primera creo el recipiente y añadir todos los registros que se encuentran

_container = new Container(c => c.Scan(s => 
{ 
    s.TheCallingAssembly(); 
    s.LookForRegistries(); 
})); 

uno de estos conjuntos escaneados contiene la siguiente inscripción

x.For<IConfigurationManager>().Singleton.Use<ConfigurationManager>(); 

2) entonces quiero para inyectar un objeto mock especial para este gestores

_configurationManagerStub = MockRepository.GenerateStub<IConfigurationManager>(); 
_container.Inject(_configurationManagerStub); 

3) Entonces las instancias del gestor se crean sin inyección setter configurado (para evitar dependencias circulares)

foreach (Type pluginType in AllManagers()) 
{ 
    managerInstances.Add(_container.GetInstance(pluginType)); 
} 

4) finalmente utilizo el método BuildUp para establecer las Propiedades de tipo IManager.

_container.Configure(x => x.SetAllProperties(c => 
{ 
    // configure the property injection for all managers 
    c.Matching(prop => typeof(IManager).IsAssignableFrom(prop.PropertyType)); 
})); 

// push in dependencies -> EXCEPTION 
managerInstances.ForEach(x => _container.BuildUp(x)); 

Desafortunadamente en la última línea del código recibo la siguiente excepción.

StructureMap.StructureMapException: StructureMap Código de excepción: 245 error al intentar crear una InstanceBuilder para IConfigurationManagerProxyd079980359cf491b821a3afb15be8a86, DynamicProxyGenAssembly2, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null ----> Sistema .ArgumentException: Expresión de tipo 'System.Object' no se puede usar para el parámetro de tipo 'System.String' del método de 'Castle.Core.Interceptor.IInterceptor [] GetIInterceptor []'

¿Por qué structuremap intenta usar InstanceBuilder cuando inyecté la instancia?

Br, David

+0

¿Ha resuelto este problema? Tengo la misma excepción. – AdamSane

Respuesta

1

El problema es con apoyo StructureMap del castillo de DynamicProxy (Rhino Mocks y Moq lo utiliza) generó los trozos cuando se utiliza en la acumulación.

Específicamente Castle genera un constructor con 2 parámetros para el tipo de proxy solicitado y esos parámetros no tienen nombres. ConstructorFunctionBuilder dentro de StructureMap no puede crear la expresión lambda adecuada en tal caso (null se trata como System.Object donde se espera System.String). Eso ni siquiera es necesario cuando solo quieres configurar arregladores de propiedades, pero no hay forma de controlar esto.

El "Inject" funcionará con stubs generados de forma no dinámica, pero es posible que desee buscar una solución diferente.

Cuestiones relacionadas