2 votes

Castle Windsor - Paramètre connectionString pour un composant (Staging vs Production)

J'ai été confronté à ce problème, et même si je préférerais quelque chose d'élégant, n'importe quel vieux hack fera l'affaire à ce stade :)

J'ai un référentiel qui est enregistré quelque chose comme :

<castle>
<properties>
        <myConnStr>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</myConnStr>
</properties>
<components>
        <component id="MyRepository" service="DomainModel.Abstract.IMyRepository, DomainModel" type="DomainModel.Concrete.MyRepository, DomainModel" lifestyle="PerWebRequest">
            <parameters>
                <connectionString>#{myConnStr}</connectionString>
            </parameters>
        </component>
</components>

J'essaie de configurer mon fichier de configuration de manière à ne pas avoir à modifier la partie de la propriété myConnStr pour les différentes options de déploiement. C'est très bien (voire idéal) si je ne peux établir la connectionString qu'une seule fois lorsque la configuration est chargée pour la première fois, mais je n'arrive pas à comprendre comment définir cette valeur lors de la configuration de mon conteneur.

Si je n'utilisais pas Castle Windsor, j'aurais simplement défini plusieurs chaînes de connexion comme "connectionStringStaging", "connectionStringProduction" et choisi la chaîne appropriée via le code en fonction de mon environnement (nom de l'ordinateur ou URL). Comment puis-je faire quelque chose comme cela avec une propriété de castle windsor ? La modification du "paramètre" du composant au lieu de la "propriété" serait également acceptable.

4voto

Mauricio Scheffer Points 70470
IWindsorContainer container = ...
container.Register(Component.For<IMyRepository>().ImplementedBy<MyRepository>()
    .LifeStyle.PerWebRequest
    .Parameters(Parameter.ForKey("connectionString").Eq(GetConnectionStringFromEnviroment())));

donde GetConnectionStringFromEnviroment() obtient la connexion appropriée de la part du <connectionStrings> de votre configuration ou n'importe où ailleurs.

Si vous avez besoin d'une configuration XML au lieu d'un code, vous pouvez le faire :

  • rédiger un ISubDependencyResolver pour ce paramètre spécifique.
  • utiliser Définitions et si (c'est probablement la solution la plus simple si vous utilisez déjà une configuration xml)

2voto

Je préférerais une solution simple et ne pas pousser le cadre à faire de la magie pour vous. Je mettrais la chaîne de connexion dans une autre classe pour fournir la bonne connexion à vos dépôts et l'ajouterais à l'arbre des dépendances.

public interface IConnectionFactory
{
    public string GetConnectionString();
}

Passez ceci dans votre 'Repositories' au lieu d'une chaîne de caractères.

0voto

Neal Points 2286

Ne pouvez-vous pas faire quelque chose comme ...

<castle>
<properties>
        <dev>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</dev>
        <stage>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</stage>
        <production>Data Source=COMPUTERNAME\SQL2008;Initial Catalog=MyDB;Persist Security Info=True;User ID=username;Password=password</production>
</properties>
<components>
        <component id="MyRepository" service="DomainModel.Abstract.IMyRepository, DomainModel" type="DomainModel.Concrete.MyRepository, DomainModel" lifestyle="PerWebRequest">
            <parameters>
                <connectionString>#{dev|stage|production}</connectionString>
            </parameters>
        </component>
</components>

Sinon, vous pouvez utiliser l'attribut configSource et stocker les paramètres d'environnement dans trois fichiers de configuration distincts. http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

Le choix de la configuration doit être une activité explicite extérieure à la base de code.

0voto

Noon Silk Points 30396

disclaimer : c'est quelque chose que j'ai écrit

À titre d'information, il est possible que ce soit excessif pour vous, mais j'ai écrit un système de déploiement pour gérer des situations comme celle-ci (différentes configurations pour différents serveurs) ; il s'appelle dashy . Il est actuellement en cours de développement (mais la version que vous pouvez télécharger devrait fonctionner, dans une mesure raisonnable :P), je ne le recommande donc pas pour une utilisation immédiate en direct ; mais n'hésitez pas à l'essayer dans un environnement de développement/stabilisation et à voir s'il est utile. Il fait plus que ce dont vous avez besoin, mais il pourrait être intéressant :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X