2009-08-15 13 views
5

StructureMapレジストリコンストラクタ内で、(別のレジストリに登録された)いくつかの型のインスタンスを取得するにはどうすればよいですか?私はそのようなコードを使用したい:StructureMapレジストリコンストラクタでインスタンスを取得するにはどうすればよいですか?

IApplicationSettingsは、アプリケーション設定へのインターフェイスです。

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

そして両方のレジストリは、ブートストラップに登録されています:このインターフェイス(現在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 in registry constructorエラーが発生しました(もちろん)。私は、StructureMapの正しい使い方を完全に理解していません。私は何か別のやり方でやるべきかもしれない。しかし、とにかく、レジストリコンストラクタに早期に登録されたある種のインスタンスを取得できますか?

答えて

7

今日も同じ問題が発生しました。 Jeremy Miller(no relation :)からの答え)は、ConfigurationMapが設定時にインスタンスを作成するようにセットアップされていないということです。

彼が推奨した回避策は、設定用のコンテナを作成することでした。ここに私の解決策があります。

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

すべての設定を独自のレジストリに移動し、設定レジストリが依存レジストリより先に設定されていることを確認しました。

これが役に立ちます。

関連する問題