2009-08-15 6 views
5

Comment puis-je obtenir une instance de type (enregistré dans un registre différent) dans le constructeur de StructureMap Registy? Je souhaite utiliser un tel code:Comment puis-je obtenir une instance dans le constructeur 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 est une interface pour les paramètres d'application. Le type de béton mise en œuvre de cette interface (actuellement de classe ConfigFileApplicationSettings) est inscrit dans un autre registre comme celui-ci:

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

Et les deux registres sont inscrits dans le programme d'amorçage:

 #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 

Lorsque je tente d'obtenir une instance de IApplicationRegisty dans le constructeur de registre J'ai une erreur (bien sûr). Je ne comprends pas complètement comment utiliser StructureMap de la bonne façon. Peut-être que je devrais faire la chose d'une manière différente. Mais de toute façon puis-je obtenir une instance d'un type déjà enregistré dans un constructeur de registre?

Répondre

7

J'ai rencontré ce même problème aujourd'hui. La réponse de Jeremy Miller (aucune relation :)) est que StructureMap n'est pas configuré pour créer des instances au moment de la configuration.

La solution de contournement qu'il a recommandée et que j'ai utilisée était de créer un conteneur juste pour les paramètres. Voici ma solution. J'ai déplacé tous les paramètres dans son propre registre et vérifié que le registre des paramètres est configuré avant le registre dépendant.

Espérons que cela aide.

Questions connexes