Reputation: 1160
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?
Upvotes: 8
Views: 3586
Reputation: 2506
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.
Upvotes: 11