/// <summary> /// Retourne l'entrée du cache pour le type de référence. /// </summary> /// <param name="referenceType">Type de référence.</param> /// <returns>Entrée du cache.</returns> private IReferenceEntry GetReferenceEntry(Type referenceType) { string region = GetCacheRegionByType(referenceType); IReferenceEntry entry = null; try { Element element = CacheManager.Instance.GetCache(region).Get(referenceType.FullName); if (element != null) { entry = element.Value as IReferenceEntry; } } catch (Exception e) { entry = BuildReferenceEntry(referenceType); ILog log = LogManager.GetLogger("Kinetix.Application"); log.Warn("Impossible d'établir une connexion avec le cache, la valeur est cherchée en base", e); } if (entry == null) { entry = BuildReferenceEntry(referenceType); CacheManager.Instance.GetCache(region).Put(new Element(referenceType.FullName, entry)); } return((IReferenceEntry)entry); }
/// <summary> /// Retourne un type de référence à partir de sa clef primaire. /// </summary> /// <param name="referenceType">Type de référence.</param> /// <param name="primaryKey">Clef primaire.</param> /// <returns>Le type de référence.</returns> public object GetReferenceObjectByPrimaryKey(Type referenceType, object primaryKey) { if (referenceType == null) { throw new ArgumentNullException("referenceType"); } if (primaryKey == null) { return(null); } for (int i = 0; i < 2; ++i) { try { IReferenceEntry entry = GetReferenceEntry(referenceType); return(entry.GetReferenceValue(Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName.ToUpperInvariant(), primaryKey)); } catch (KeyNotFoundException e) { if (i == 1) { throw new KeyNotFoundException(e.Message, e); } FlushCache(referenceType); } } throw new KeyNotFoundException(); }
/// <summary> /// Construit l'entrée pour le cache de référence. /// </summary> /// <param name="referenceType">Type de la liste de référence.</param> /// <returns>Entrée du cache.</returns> private static IReferenceEntry BuildReferenceEntry(Type referenceType) { ICollection <ReferenceResource> resourceList = LoadResources(referenceType); ICollection referenceList = referenceListLoader(referenceType); Type entryType = typeof(ReferenceEntry <>).MakeGenericType(referenceType); IReferenceEntry entry = (IReferenceEntry)Activator.CreateInstance(entryType); entry.Initialize(referenceList, resourceList); return(entry); }
/// <summary> /// Retourne la liste de référence du type referenceType. /// </summary> /// <param name="referenceType">Type de la liste de référence.</param> /// <param name="referenceName">Nom de la liste de référence à utiliser.</param> /// <returns>Liste de référence.</returns> public object GetReferenceList(Type referenceType, string referenceName) { if (referenceType == null) { throw new ArgumentNullException("referenceType"); } // Si l'élément n'est pas mis en cache (pas d'attribut Reference de mis sur le type), on appelle directement le service de chargement. if (!string.IsNullOrEmpty(referenceName)) { return(ServiceManager.Instance.InvokeReferenceAccessor(referenceType, referenceName)); } if (!HasCache(referenceType)) { return(ServiceManager.Instance.InvokeReferenceAccessor(referenceType, null)); } IReferenceEntry entry = GetReferenceEntry(referenceType); object cachedList = entry.GetReferenceList(Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName.ToUpperInvariant()); Type typedList = typeof(List <>).MakeGenericType(referenceType); return(Activator.CreateInstance(typedList, (IEnumerable)cachedList)); }