/// <summary> /// Cette fonction permet de récupérer les informations d'acces à la base de données tel que /// préciser dans les attributs d'une classe Persistable. /// </summary> /// <param name="persistableObjectType">Type dont on souhaite récupérer les infos</param> /// <param name="pdsa">contient l'instance de l'attribut PersistsDataSource de la classe</param> /// <param name="pcs">contient l'instance de l'attribut PersistsConnexionString de la classe</param> private void GetDatabaseInformation(Type persistableObjectType,out PersistDataSourceAttribute pdsa, out PersistConnectionStringAttribute pcs) { pdsa=null; // contient les requetes utile pour l'acces au données pcs=null; // contient l'attribut de la chaine de connexion #region Gestion du cache pour PCS et PDSA PersistCacheItem ci=null; // pour stocker l'item du cache si besoin if (TypeInfoCacheEnable) { if (_slTypeInfoCache.Contains(persistableObjectType.AssemblyQualifiedName)) { // les informations pour ce type de données sont déjà présentes dans le cache. ci=(PersistCacheItem)_slTypeInfoCache[persistableObjectType.AssemblyQualifiedName]; // si pdsa & pcs sont différents de null, on renvoi directement ces valeurs if (ci.pcs!=null && ci.pdsa!=null) { pdsa=ci.pdsa; pcs=ci.pcs; return; } } else { // le cache ne contient les données pour ce type => on ajout un nouveau persistCacheItem dans le cache ci=new PersistCacheItem(); _slTypeInfoCache.Add(persistableObjectType.AssemblyQualifiedName,ci); } } #endregion MemberInfo objInfo=persistableObjectType; /* recherche des informations de persistance lié à la classe : recherche de l'attribut [PersistDataSource] */ object[] tabAttrs=objInfo.GetCustomAttributes(true); foreach(object obj in tabAttrs) { if (obj is PersistDALAttribute) { if (pdsa==null) pdsa=obj as PersistDataSourceAttribute; // si obj est un [PersistDataSource] on stocke sa référence if (pcs==null) pcs=obj as PersistConnectionStringAttribute; // on stocke la ref a l'attribut si c'est une [PersistConnectionString] // pour recupérer la chaine de connection a utiliser } } if (pdsa==null) // si pas de [PersistDataSource] sur la classe ==> Erreur : pas persistable throw new PersistException("Not a persistable class, or class without PersistDataSourceAttribute inherited attribute"); if (pcs==null) // si pas de [PersistConnectionString] sur la classe ==> Erreur pas d'info de connexion à la base throw new PersistException("No ConnectionString information for accessing DataBase"); #region Gestion du cache pour PCS et PDSA // on met a jour les info du CacheItem et on l'ajoute dans le cache si cache activé if (ci!=null) { ci.pdsa=pdsa; ci.pcs=pcs; } #endregion }
/// <summary> /// Cette fonction permet de récupérer les informations d'acces à la base de données tel que /// préciser dans les attributs d'une classe Persistable. /// </summary> /// <param name="persistableObjectType">Type dont on souhaite récupérer les infos</param> /// <param name="pdsa">contient l'instance de l'attribut PersistsDataSource de la classe</param> /// <param name="pcs">contient l'instance de l'attribut PersistsConnexionString de la classe</param> private void GetDatabaseInformation(Type persistableObjectType, out PersistDataSourceAttribute pdsa, out PersistConnectionStringAttribute pcs) { pdsa = null; // contient les requetes utile pour l'acces au données pcs = null; // contient l'attribut de la chaine de connexion #region Gestion du cache pour PCS et PDSA PersistCacheItem ci = null; // pour stocker l'item du cache si besoin if (TypeInfoCacheEnable) { if (_slTypeInfoCache.Contains(persistableObjectType.AssemblyQualifiedName)) { // les informations pour ce type de données sont déjà présentes dans le cache. ci = (PersistCacheItem)_slTypeInfoCache[persistableObjectType.AssemblyQualifiedName]; // si pdsa & pcs sont différents de null, on renvoi directement ces valeurs if (ci.pcs != null && ci.pdsa != null) { pdsa = ci.pdsa; pcs = ci.pcs; return; } } else { // le cache ne contient les données pour ce type => on ajout un nouveau persistCacheItem dans le cache ci = new PersistCacheItem(); _slTypeInfoCache.Add(persistableObjectType.AssemblyQualifiedName, ci); } } #endregion MemberInfo objInfo = persistableObjectType; /* recherche des informations de persistance lié à la classe : recherche de l'attribut [PersistDataSource] */ object[] tabAttrs = objInfo.GetCustomAttributes(true); foreach (object obj in tabAttrs) { if (obj is PersistDALAttribute) { if (pdsa == null) { pdsa = obj as PersistDataSourceAttribute; // si obj est un [PersistDataSource] on stocke sa référence } if (pcs == null) { pcs = obj as PersistConnectionStringAttribute; // on stocke la ref a l'attribut si c'est une [PersistConnectionString] } // pour recupérer la chaine de connection a utiliser } } if (pdsa == null) // si pas de [PersistDataSource] sur la classe ==> Erreur : pas persistable { throw new PersistException("Not a persistable class, or class without PersistDataSourceAttribute inherited attribute"); } if (pcs == null) // si pas de [PersistConnectionString] sur la classe ==> Erreur pas d'info de connexion à la base { throw new PersistException("No ConnectionString information for accessing DataBase"); } #region Gestion du cache pour PCS et PDSA // on met a jour les info du CacheItem et on l'ajoute dans le cache si cache activé if (ci != null) { ci.pdsa = pdsa; ci.pcs = pcs; } #endregion }