10

Personnellement, j'aime l'option de configurer StructureMap à partir du code C#. D'après ce que je comprends, l'un des avantages de DI, c'est que nous pouvons facilement échanger une nouvelle instance concrète. Mais, si la configuration est définie dans le code, les instances concrètes sont codées en dur dans la DLL.Configuration Xml ou Configuration par code?

Donc, pratiquement, c'est aussi bon que d'avoir codé en dur les dépendances, non? Je sais que, au cours des essais, il rend la vie plus facile ...

Mon point est, wouldnt il est préférable d'utiliser la configuration XML à la place? vous voulez ajouter une nouvelle instance concrète? faites en sorte que votre installateur remplace le fichier structuremap.config par le nouveau. Alors, quelle est la manière préférée de configurer StructureMap?

supplémentaire: suis obligé d'utiliser la configuration C# pour le moment parce que je ne sais pas comment passer la chaîne de connexion à l'instance. Je peux écrire la chaîne de connexion dans le fichier de configuration, mais je voudrais réutiliser la chaîne de connexion définie dans app.config.

Répondre

17

Peu importe qui DI particulier récipient que vous utilisez, vous devez toujours reporter la résolution du graphe d'objet de l'application à la last responsible moment. C'est ce qu'on appelle les Composition Root de l'application.

Vous pouvez écrire la majeure partie de votre application without ever referencing the DI Container. Cela signifie également que vous pouvez reporter la décision entre la configuration dans le code ou la configuration jusqu'à ce que vous en ayez besoin.

Vous shouldn't need the container at all for unit testing, mais il peut avoir besoin pour les tests d'intégration. Cependant, dans les tests d'intégration, vous aurez probablement besoin d'une configuration différente pour le conteneur que dans l'application finale.

Dans l'ensemble, la configuration du conteneur dans le code est la meilleure approche ces jours-ci, car il est plus robuste et vous pouvez appliquer la mécanique de configuration basée sur les conventions.

La configuration XML a tendance à être plus fragile et trop verbeuse. Dans la plupart des cas, cela vous ralentit simplement parce que vous n'avez pas de refactoring ou de support du compilateur. Cependant, la configuration XML est toujours valide lorsque vous devez pouvoir permuter des dépendances sans recompiler l'application. La plupart des conteneurs DI vous permettront de mélanger ces approches afin que vous puissiez avoir la plupart de votre configuration dans le code, mais quelques dépendances sélectionnées définies dans XML pour des raisons d'extensibilité.

+0

hmm ... qui semble raisonnable. Merci!! –

+0

Alors que je suis d'accord avec votre réponse. Il semble que la question est vraiment de savoir comment obtenir ma configuration d'application dans mes types. – KevM

+0

@KevM, pas vraiment. Ma question était plutôt de savoir quelle option de configuration est la meilleure. Il est apparu, parce que j'avais de la difficulté à obtenir ma chaîne de connexion dans mes types en utilisant xml. J'aurais dû écrire la chaîne de connexion une fois de plus dans le fichier structuremap.config. J'avais voulu éviter d'avoir à maintenir la connexion à deux endroits. –

6

Pour répondre à votre question, vous pouvez avoir votre gâteau et le manger dans StructureMap. Vous pouvez configurer votre conteneur à partir du code et ajouter ce peu de configuration dont vous avez besoin à partir de la configuration de l'application. C'est ce que EqualToAppSetting est pour.

Créer une classe de paramètres

public class DatabaseSettings 
{ 
    public DatabaseSettings(string type, string connectionString) 
    { 
     Type = type; 
     ConnectionString = connectionString; 
    } 

    public string Type { get; set; } 
    public string ConnectionString { get; set; } 
} 

Suivant dire StructureMap pour configurer à l'aide de vos paramètres d'application.

 [Test] 
    public void setup_concrete_class_via_application_configuration() 
    { 
     var container = new Container(config => 
     { 
      config.ForConcreteType<DatabaseSettings>().Configure 
       .Ctor<string>("type").EqualToAppSetting("dovetail.database.type", "mssql") 
       .Ctor<string>("connectionString").EqualToAppSetting("dovetail.database.connectionString"); 

     }); 

     var databaseSettings = container.GetInstance<DatabaseSettings>(); 
     databaseSettings.Type.ShouldEqual("mssql"); 
     databaseSettings.ConnectionString.ShouldEqual("Data Source=.; Initial Catalog=dovetail;User Id=sa;Password=sa;"); 
    } 

Enfin voici ce que les paramètres d'application ressemblent dans ma config d'application:

<appSettings> 
    <add key="dovetail.database.type" value="mssql"/> 
    <add key="dovetail.database.connectionString" value="Data Source=.;Initial Catalog=dovetail;User Id=sa;Password=sa;"/>  
</appSettings> 
+0

J'ai pensé à cela, mais l'inconvénient était que je devais suivre la chaîne de connexion à deux endroits. un ici et une fois dans la section connectionstring du web/app.config ... Merci pour la réponse :) –

+0

utilisez votre suggestion en ce moment pour résoudre mon problème de chaîne de connexion. Au démarrage de l'application, je modifie le fichier web.config pour inclure un nouveau paramètre d'application appelé connectionString. Il obtient sa valeur à partir de la chaîne connectionString définie dans la section connectionStrings appropriée. Donc je dois modifier la chaîne de connexion seulement à un endroit. et ma configuration structuremap peut le lire depuis les appsettings ... merci! –

+0

Heureux de vous aider. Nous avons créé un moyen de tirer conventionnellement la config dans les objets paramètres pour éviter toute configuration de conteneur. Je devrais vraiment bloguer à ce sujet. – KevM