How can I get an instance of some type (registered in a different Registry) inside StructureMap Registy constructor? I want to use such a code:
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 is an interface to application settings. The concrete type implementing this interface (currently ConfigFileApplicationSettings class) is registered in another registry like this:
public ApplicationServicesRegistry()
{
ForRequestedType<IApplicationSettings>().TheDefault.IsThis(
new ConfigFileApplicationSettings());
}
And both registries are registered in the Bootstrapper:
#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
When I try to get an instance of IApplicationRegisty in registry constructor I've got an error (of course). I don't completly understand how to use StructureMap the right way. May be I should do the thing some different way. But anyway can I get an instance of some type early registered in an Registry constructor?
I ran into this same problem today. The answer from Jeremy Miller (no relation :) ) is that StructureMap is not setup to create instances at configuration time.
The workaround he recommended and that I used was to create a container just for the settings. Here is my solution.
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 moved everything settings into its own registry and made sure the settings registry gets configured before the dependent registry.
Hope this helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With