2009-08-15 2 views
5

Как я могу получить экземпляр некоторого типа (зарегистрированного в другом реестре) внутри конструктора StructureMap Registy? Я хочу использовать такой код:Как я могу получить экземпляр в конструкторе StructureMap Registy?

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 - это интерфейс к настройкам приложения. Конкретный тип, реализующий этот интерфейс (в настоящее время ConfigFileApplicationSettings класс) зарегистрирован в другом регистре, как это:

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

И регистратуры регистрируются в загрузчике:

 #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 

Когда я пытаюсь получить экземпляр IApplicationRegisty в конструкторе реестра У меня есть ошибка (конечно). Я не понимаю, как правильно использовать StructureMap. Может быть, я должен сделать что-то по-другому. Но в любом случае я могу получить экземпляр какого-либо типа, раннего зарегистрированного в конструкторе реестра?

ответ

7

Сегодня я столкнулся с этой проблемой. Ответ Джереми Миллера (без отношения :)) заключается в том, что StructureMap не настроен для создания экземпляров во время настройки.

Обходной путь, который он рекомендовал, и что я использовал, - это создать контейнер только для настроек. Вот мое решение.

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. 
    } 
} 

Я переместил все настройки в свой собственный реестр и убедился, что реестр настроек настроен до зависимого реестра.

Надеюсь, это поможет.

Смежные вопросы