示例#1
0
文件: Set.cs 项目: CFLShine/CFL
        public ClassProxy GetProxy(Guid id)
        {
            ClassProxy _classProxy = null;

            __proxies.TryGetValue(id, out _classProxy);
            return(_classProxy);
        }
示例#2
0
        /// <summary>
        /// Trouve et retourne le <see cref="ClassProxy"/> de entity s'il existe, ou le crée et l'attache, ainsi
        /// que les <see cref="ClassProxy"/> de ces membres objets de<see cref="Base"/>,
        /// puis le retourne.
        /// Provoque une exception si entity est null ou non représenté
        /// par un <see cref="Set"/> dans ce <see cref="ShContext"/>.
        /// </summary>
        public ClassProxy GetOrAttach(Base entity)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            Set _set = GetSet(entity.GetType());

            if (_set == null)
            {
                throw new Exception
                          ("Le type d'entity " + entity.GetType().Name + " n'a pas été représenté dans le Context");
            }

            ClassProxy _proxy = _set.GetProxy(entity);

            if (_proxy == null)
            {
                _proxy = new ClassProxy(this, entity);
                _set.AddProxy(_proxy);
            }

            Set _attacheds = new Set <Base>();

            _attacheds.AddProxy(_proxy);
            AttachProxyChildren(_proxy, _attacheds);

            return(_proxy);
        }
示例#3
0
        public ClassProxy(ShContext context, Type classType, Guid id)
            : base(context)
        {
            ClassProxy _proxy = this;

            ProxyFactory.ClassProxyFactory(Context, ref _proxy, classType, id);
            IsBuilt = true;
        }
示例#4
0
文件: Set.cs 项目: CFLShine/CFL
        public ClassProxy Factory()
        {
            Base       _entity = (Activator.CreateInstance(Type)) as Base;
            ClassProxy _proxy  = new ClassProxy(Context, _entity)
            {
                Context = Context
            };

            return(_proxy);
        }
示例#5
0
        public ClassProxy(ShContext context, Base entity)
            : base(context)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }
            ClassProxy _proxy = this;

            ProxyFactory.ClassProxyFactory(Context, ref _proxy, entity.GetType(), entity.ID);
            __entity = entity;
            UpdateProxyValues();
            IsBuilt = true;
        }
示例#6
0
文件: Set.cs 项目: CFLShine/CFL
        /// <summary>
        /// Trouve ou ajoute au <see cref="Set"/> le <see cref="ClassProxy"/> construit
        /// sur entity.
        /// </summary>
        public ClassProxy GetOrAttachProxy(Base entity)
        {
            ClassProxy _proxy = GetProxy(entity);

            if (_proxy == null)
            {
                _proxy = new ClassProxy(Context, entity)
                {
                    Context = Context
                };
                AddProxy(_proxy);
            }

            return(_proxy);
        }
示例#7
0
        private void AttachProxyChildren(ClassProxy proxy, Set attacheds)
        {
            foreach (PropertyObjectProxy _prProxy in proxy.PropertiesObjects())
            {
                Base _entity = _prProxy.Entity;
                Attach(_entity, attacheds);
            }

            foreach (PropertyListProxy _prListProxy in proxy.PropertiesList())
            {
                foreach (Base _entity in _prListProxy.Entities())
                {
                    Attach(_entity, attacheds);
                }
            }
        }
示例#8
0
 private void Attach(Base entity, Set attacheds)
 {
     if (entity != null && !attacheds.IsAttached(entity))
     {
         Set _set = GetSet(entity.GetType());
         if (_set != null)
         {
             ClassProxy _childProxy = _set.GetProxy(entity);
             if (_childProxy == null)
             {
                 _childProxy = new ClassProxy(this, entity);
                 _set.AddProxy(_childProxy);
             }
             attacheds.AddProxy(_childProxy);
             AttachProxyChildren(_childProxy, attacheds);
         }
     }
 }
示例#9
0
        /// <summary>
        /// Trouve et retourne le proxy de type typename et ID id s'il existe,
        /// ou le crée, lui donnant son id, l'attache et le retourne.
        ///
        /// Cette fonction est utile lors d'un chargement de données, par exemple
        /// lors de la lecture des données retournées par une DB.
        /// Les proxys sont alors crées à partir de ces données, leur id leur est donné,
        /// ainsi que leurs valeurs.
        /// Les id et données de leur propriétés object de <see cref="Base"/>,
        /// ou des objets contenus dans des propriétés collection, ne sont
        /// pas connus à ce moment, cette fonction n'attache donc pas en cascade
        /// ces propriétés. C'est code qui lit les données qui est chargé
        /// de générér chaque proxy et entité, ouis l'appelle à la fonction
        /// <see cref="UpdateEntitiesValues"/> recrée les liens.
        ///
        /// Provoque une exception si typename n'est pas le nom d'un type représenté
        /// par un <see cref="Set"/> dans ce context, ou si id est un <see cref="Guid.Empty"/>.
        /// </summary>
        public ClassProxy GetOrAttach(string typename, Guid id)
        {
            if (string.IsNullOrWhiteSpace(typename))
            {
                throw new Exception("typename ne peut pas être null ou vide.");
            }

            Set _set = GetSet(typename);

            if (_set == null)
            {
                throw new Exception("Le type " + typename + " n'est pas représenté dans ce context.");
            }

            ClassProxy _proxy = _set.GetProxy(id);

            if (_proxy == null)
            {
                _proxy = new ClassProxy(this, _set.Type, id);
                _set.AddProxy(_proxy);
            }

            return(_proxy);
        }
示例#10
0
        public static ClassProxy ClassProxyFactory(ShContext context, ref ClassProxy proxy, Type t, Guid id)
        {
            if (proxy == null)
            {
                return(new ClassProxy(context, t, id));// appellera cette fonction à nouveau.
            }
            proxy.Context = context;
            proxy.Type    = t;

            if (proxy.ID == Guid.Empty)
            {
                proxy.ID = id;
            }

            foreach (PropertyInfo _pr in t.GetProperties())
            {
                if (PropertyHelper.IsMappableProperty(_pr))
                {
                    proxy.SetProperty(_pr.Name, PropertyProxyFactory(context, _pr, proxy));
                }
            }

            return(proxy);
        }
示例#11
0
 public PropertyProxy(ShContext context, PropertyInfo prInfo, ClassProxy parent)
     : base(context)
 {
     PropertyInfo = prInfo;
     Parent       = parent;
 }
示例#12
0
文件: Set.cs 项目: CFLShine/CFL
 /// <summary>
 /// Ajoute un <see cref="ClassProxy"/> à ce <see cref="Set"/>.
 /// Ne vérifie pas qu'il n'y soit déja.
 /// </summary>
 public void AddProxy(ClassProxy proxy)
 {
     __proxies[proxy.ID] = proxy;
 }
示例#13
0
        public static PropertyProxy PropertyProxyFactory(ShContext context, PropertyInfo prInfo, ClassProxy parent)
        {
            if (TypeHelper.IsPrimitiveOrAlike(prInfo.PropertyType))
            {
                return(new PropertyPrimitiveProxy(context, prInfo, parent));
            }
            if (prInfo.PropertyType.IsSubclassOf(typeof(Base)))
            {
                return(new PropertyObjectProxy(context, prInfo, parent));
            }
            if (TypeHelper.IsGenericList(prInfo.PropertyType))
            {
                return(new PropertyListProxy(context, prInfo, parent));
            }
            if (TypeHelper.IsDictionary(prInfo.PropertyType))
            {
                return(new PropertyDictionaryProxy(context, prInfo, parent));
            }
            if (prInfo.PropertyType.IsEnum)
            {
                return(new PropertyEnumProxy(context, prInfo, parent));
            }

            throw new Exception("Le type " + prInfo.PropertyType.Name + " n'est pas pris en compte.");
        }