2011-07-21 3 views
2

Une approche que nous avons récemment adoptée consiste à inclure un registre StructureMap dans chacun de nos assemblys définissant les dépendances par défaut.StructureMap: comment configurer correctement les dépendances par défaut

Nous utilisons un scanner pour le faire:

 cfg.Scan(scanner => 
     { 
      scanner.TheCallingAssembly(); 
      scanner.Assembly("Assembly1"); 
      scanner.Assembly("Assembly2"); 
      scanner.Assembly("Assembly3"); 

      scanner.LookForRegistries(); 
     }); 

L'idée est que nous pouvons alors override les dépendances par défaut de l'application principale.

La question est, où devrions-nous enregistrer ces remplacements? c'est-à-dire avant de numériser ?, après avoir numérisé?

En outre, l'ordre des assemblys spécifié dans l'expression de l'analyse affecte-t-il l'ordre dans lequel les dépendances sont enregistrées. Donc, dans l'exemple ci-dessus, les registres contenus dans l'application principale (TheCallingAssembly) seraient-ils remplacés par ceux de "Assembly3"?

Un grand merci
Ben

Répondre

4

Registries à TheCallingAssembly sera surchargée par ceux que vous inscrivez dans Assembly1, 2, etc.

Donc, si vous vous inscrivez ISomeInterface dans chacun de ces assemblées, celui Assemblée3 sera le défaut. Ceux enregistrés dans les autres assemblées que vous pouvez obtenir de StructureMap en appelant

container.GetAllInstances<ISomeInterface>(); 

Ceci renverra un IList de tous les ISomeInterface enregistrés dans StructureMap.

Si vous voulez remplacer ceux que vous obtenez en scannant, vous devez à nouveau configurer le conteneur pour une raison quelconque. Si vous ne le faites pas, le dernier type analysé est la valeur par défaut.

Dans cet exemple, l'interface ISomeInterface enregistrée dans Assembly1 est la valeur par défaut. Lorsque vous regardez le code, on pourrait croire que SomeOtherClass est la valeur par défaut. Mais c'est en fait celui enregistré dans Assembly1 qui est la valeur par défaut. Donc, pour remplacer les mappages des assemblages analysés. Vous devez à nouveau configurer le conteneur comme dans cet exemple. Ici, SomeOtherClass est la valeur par défaut pour ISomeInterface.

var container = new Container(x => { 
      x.Scan(scanner => 
      { 
       scanner.TheCallingAssembly(); 
       scanner.Assembly("Assembly1"); 

       scanner.LookForRegistries(); 
      }); 
     }); 

container.Configure(x => x.For<ISomeInterface>().Use<SomeOtherClass>()); 
Questions connexes