Architecture

Résolu
Signaler
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011
-
Messages postés
433
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
4 décembre 2009
-
Hello les codeurs !

Voila, après quelques soucis, je reprend mon projet tranquillement et je voudrais découper ma solution en plusieurs projets logique.

1) La base de données + Classe LinqToSQL
2) La couche Metier, qui va etre tous les éléments logiques de ma classe. (qui va faire appel à la base)
3) La couche Présentation qui va etre simplement les pages qui vont faire appel aux autres couches.

J'ai commencé à monter cette architecture, et tout fonctionne à merveille. ou presque !
J'ai 2 soucis :

1) Dans mon projet Base de donnée j'ai une classe : ConnBDD qui me permet de recuperer un objet SqlConnection qui va etre utile pour la couche metier. (comme cela)
<hr size="2" width="100%" />using System.Configuration;
using System.Data.SqlClient;

namespace BDD
{
    /// <summary>
    /// Connexion à la base de donnée
    /// </summary>
    public class ConnBDD
    {
        /// <summary>
        /// SqlConnection de la chaine de connexion à la base de donnée
        /// </summary>
        /// <returns></returns>
        public static SqlConnection MyConn =
            new SqlConnection(ConfigurationManager.ConnectionStrings["ASPNETDBConnectionString"].ConnectionString);
    }
}
<hr size="2" width="100%" />Mais quand j'appel cette classe depuis ma couche metier, mon attibu MyConn est null. Vous savez pourquoi ?

2) Dans ma couche présentation j'utilise les éléments de VS2008 pour se connecter à l'application directement (asp:Login...) mais je n'ai pas mis de lien avec ma couche BDD, donc il cree à chaque run une base ASPNETDB.MDF dans la couche présentation. Moi, ce que j'aimerais c'est configurer le pointage vers la base qui se trouve dans l'autre projet.

Si vous avez des idées, n'hésitez pas !

Merci

5 réponses

Messages postés
433
Date d'inscription
samedi 26 avril 2003
Statut
Membre
Dernière intervention
4 décembre 2009
1
Bonjour,

Afin de ne pas trop te prendre la tête avec des connections à la base de données, je te conseille d'utiliser le "Data Application Block" de l'excellent Framework open source "MS Enterpise Library 4.0". Le principe est simple :
Tu déclare dans ton web.config une chaine de connection nommée vers ta base et ensuite dans ta couche de DATAS tu utilise une DataBaseFactory pour créer ta connection.

> du coup, plus de problèmes.


Ensuite pour ton point concernant l'utilisation des controles de sécurité de ASP.Net, il faut que tu mette en place un membership provider. Tu peux configurer le provider pour qu'il attaque ta base de données de ton projet. Tu trouveras un excellent article de scott mitchell sur le sujet à cette adresse :
http://aspnet.4guysfromrolla.com/articles/120705-1.aspx

Autre remarque : il n'est pas nécessaire de redonner un fichier web.config dans la couche de DATAS puisque au runtime, ta couche de datas utilisera le web.config du contexte courant, cad le fichier web.config de ta couche WEB (je pense que c'est de la que viennent tes problemes de référence nulle).

Happy coding
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
14 février 2015
49
Salut

Pour ton 1er soucis, je te conseille plutôt de passer par une classe Singleton (enfin pas exactement singleton, mais presque), ce sera beaucoup plus pratique pour la gestion d'erreurs, des accès etc...
public class ConnBDD
{
    private static SQLConnection myConn = null;
   
    public staticSQLConnection MyConn
    {
        get
        {            if (myConn null) myConn newSqlConnection(ConfigurationManager.ConnectionStrings["ASPNETDBConnectionString"].ConnectionString);
            return myConn;
        }
    }
}
Comme je le disais, c'est pas tout à fait un singleton puisque myConn est de type SQLConnection et non ConnBDD, mais le principe est relativement le même.

Théoriquement, vu la façons dont j'ai nommé les propriétés / attributs, en remplaçant ton code par ça tu n'as rien à changer nulle-part.
Et grâce à ça, tu peux par exemple faire un try/catch autour de la création de ta connexion, tu peux faire des conditions, etc. (Et si tu veux transmettre des arguments, fait une fonction à la place de la propriété.

Quant à ton 2eme problème, tu peux pas simplement indiquer le chemin en absolu ? (enfin je dis ça, tu as déjà dû essayer, mais j'ai pas d'autre idée là)

Krimog :
while (!succeed = try()) ;
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

Merci Krimog.

Je vais effectivement faire comme ca pour la 1ere question. Cela sera plus propre dans la maniere de gérer ma connexion. (Je test ce soir et vous tien informé si ca marche pas :p)

Pour la 2eme question, c'est un peu plus complexe. Je veix bien mettre mon chemin en Absolu, mais ou ?

Rappel de mon arborecence :

+BDD
 | - App_Data
    | - ASPNETDB.MDF
 | - web.config
    | - ConnectionString ...AttachDbFilename=|DataDirectory|\ASPNETDB.MDF
+METIER
+WEB
 | - web.config

Donc, Comment mettre dans le 2eme Web.config (partie WEB) la liaison avec la vrai base de donnée qui est dans le projet BDD ? (Mettre une connetionString avec l'adresse en absolu  ? faire reference à l'autre connetionString ?)

Bref, j'ai toujours quelques questions, mais vu ta signature, je suis sur que ca va marcher bientot :)
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

C'est deja moi :p

Pour la 1ere question, ce n'est pas tout à fait résolu. J'ai écris ca pour que ca fonctionne (et ca marche) mais c'est pas du tout propre de l'ecrire à la main ! Parce qu'en effet, j'ai une execption : 'La référence d'objet n'est pas définie à une instance d'un objet.'

La code (qui marche mais pas propre) :
 
<hr />
public

static
SqlConnection MyConn{

   get{

      if (myConn ==
null){

         try{
            myConn =
new
SqlConnection(
ConfigurationManager.ConnectionStrings[
"ASPNETDBConnectionString"].ConnectionString);
         }

         catch (
Exception){

            const
string conString =
"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\ASPNETDB.MDF;Integrated Security=True;User Instance=True; Language=French; Pooling=true; Max Pool Size=100";
            myConn =
new
SqlConnection(conString);
         }
      }

      return myConn;
   }
}
<hr />
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
es-tu certain d'avoir mis ta connection string dans la bonne section et avec le bon nom dans ton web.config?
car si tu erreur de type reference d'objet n'est pas définie a une isntance d'un objet sur ta ligne "myConn =
newSqlConnection(
ConfigurationManager.ConnectionStrings[
"ASPNETDBConnectionString"].ConnectionString);", je ne vois pas ce que ca pourrait etre d'autre.

donc vérifie que tu as bien mis ta chaine de connexion dans
<connectionStrings> avec ASPNETDBConnectionString" ..... /></connectionStrings>