2009-08-15 14 views
5

¿Cómo puedo obtener una instancia de algún tipo (registrada en un Registro diferente) dentro del constructor de Registros de StructureMap? Quiero utilizar un código:¿Cómo puedo obtener una instancia en StructureMap Registy constructor?

public RepositoriesRegistry() 
    { 
     IApplicationSettings lApplicationSettings = 
      ObjectFactory.GetInstance<IApplicationSettings>(); 
     Debug.Assert(lApplicationSettings != null); 

     const string cSupportedDevicesConnectionString = 
      "metadata=res://*/Models.SupportedDevices.Database.SupportedDevicesModel.csdl|res://*/Models.SupportedDevices.Database.SupportedDevicesModel.ssdl|res://*/Models.SupportedDevices.Database.SupportedDevicesModel.msl;provider=System.Data.SqlClient;provider connection string=\"{0}\""; 
     string lSupportedDevicesConnectionString = 
      string.Format(cSupportedDevicesConnectionString, lDatabaseConnectionString); 
     SupportedDevicesEntities lSupportedDevicesEntities = 
      new SupportedDevicesEntities(lSupportedDevicesConnectionString); 
     ForRequestedType<SupportedDevicesEntities>().TheDefault.IsThis(
      lSupportedDevicesEntities); 
     ForRequestedType<ISupportedDevicesRepository>().TheDefault.IsThis(
      new SupportedDevicesRepository(lSupportedDevicesEntities)); 

    } 

IApplicationSettings es una interfaz para la configuración de la aplicación. El tipo concreto implementación de esta interfaz (actualmente clase ConfigFileApplicationSettings) se ha registrado en otro registro de la siguiente manera:

public ApplicationServicesRegistry() 
    { 
     ForRequestedType<IApplicationSettings>().TheDefault.IsThis(
      new ConfigFileApplicationSettings()); 
    } 

Y ambos registros están registrados en el programa previo:

 #region IBootstrapper Members 

    public void BootstrapStructureMap() 
    { 
     ObjectFactory.Initialize(InitalizeStructureMapContainer); 
    } 

    #endregion 

    #region Private properties 

    private static bool HasStarted { get; set; } 

    #endregion 

    #region Private methods 

    private void InitalizeStructureMapContainer(IInitializationExpression x) 
    { 
     x.IgnoreStructureMapConfig = true; 
     x.AddRegistry<ViewModelRegistry>(); 
     x.AddRegistry<ApplicationServicesRegistry>(); 
     x.AddRegistry<RepositoriesRegistry>(); 
     x.AddRegistry<DataOperationsRegistry>(); 
    } 

    #endregion 

Cuando intento para obtener una instancia de IApplicationRegisty en el constructor del registro Tengo un error (por supuesto). No entiendo completamente cómo usar StructureMap de la manera correcta. Puede ser que debería hacer la cosa de otra manera. Pero, de todos modos, ¿puedo obtener una instancia de algún tipo registrada anteriormente en un constructor de registro?

Respuesta

7

Me encontré con este mismo problema hoy. La respuesta de Jeremy Miller (sin relación :)) es que StructureMap no está configurado para crear instancias en el momento de la configuración.

La solución alternativa que recomendó y que yo utilicé fue crear un contenedor solo para la configuración. Aquí está mi solución.

public class SettingsRegistry : Registry 
{ 
    public SettingsRegistry() 
    { 
     ForRequestedType<ISettingsProvider>().TheDefault.Is.OfConcreteType<AppSettingsProvider>(); 

     Scan(s => 
     { 
      s.TheCallingAssembly(); 
      s.With<SettingsScanner>(); 
     }); 
    } 
} 

public class RegistryNeedingSettings : Registry 
{ 
    public RegistryNeedingSettings() 
    { 
     var settingsContainer = new Container(new SettingsRegistry()); 
     var coreSettings = settingsContainer.GetInstance<CoreSettings>(); 

     //configuration needing access to the settings. 
    } 
} 

I trasladó la configuración de todo en su propio registro y se aseguró el registro de configuración se configura ante el registro dependiente.

Espero que esto ayude.

Cuestiones relacionadas