Ejemplo n.º 1
0
        /// <summary>
        /// Ritorna proxy create per business object
        /// </summary>
        /// <returns></returns>
        private static ProxyEntryBiz buildBizProxyEntry(Type tOriginal, ProxyAssemblyCache.ProxyAssemblyBiz outProxy)
        {
            //Chiave
            long iOriginalTypeHandle = tOriginal.TypeHandle.Value.ToInt64();

            //Recupera tipo dal
            var tBizGen = tOriginal.BaseType;

            while (!tBizGen.IsGenericType)
            {
                tBizGen = tBizGen.BaseType;
            }

            if (tBizGen == null)
            {
                throw new ArgumentException(string.Format("Il tipo business {0} non eredita da BusinessObject<T>", tOriginal.Name));
            }

            var tDal = tBizGen.GetGenericArguments()[0];

            //Qui dovremmo assicurarci che la scansione dal sia avvenuta
            ProxyAssemblyCache.Instance.GetDaoEntry(tDal);

            //Imposta costruttore
            Type[] argTypesDef = new Type[] { typeof(object) };
            Type[] argTypes    = new Type[] { tDal };

            DynamicMethod dm    = new DynamicMethod("MyCtor", tOriginal, argTypesDef, tOriginal.Module);
            ILGenerator   ilgen = dm.GetILGenerator();

            ilgen.Emit(OpCodes.Ldarg_0);
            ilgen.Emit(OpCodes.Newobj, tOriginal.GetConstructor(argTypes));
            ilgen.Emit(OpCodes.Ret);

            var entry = new ProxyEntryBiz()
            {
                TypeKey = iOriginalTypeHandle,
                DalType = tDal,
                Create  = (ProxyEntryBiz.FastCreateBizObj)dm.CreateDelegate(typeof(ProxyEntryBiz.FastCreateBizObj))
            };

            outProxy.TypeBizEntries.Add(iOriginalTypeHandle, entry);

            return(entry);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Ritorna proxy create per business object
        /// </summary>
        /// <returns></returns>
        public static void BuildBizProxyFromAssembly(ProxyAssemblyCache.ProxyAssemblyBiz outProxy)
        {
            var listBiz       = new List <Type>();
            var listFact      = new List <Type>();
            var bizCacheLocal = new ProxyEntryBizDic(30);

            //Controlla ogni tipo definito nell'Assembly
            foreach (Type tOriginal in outProxy.SrcAss.GetTypes())
            {
                //Se e' biz lo segna
                if (tOriginal.IsSubclassOf(TYPE_BIZ_OBJ_BASE))
                {
                    listBiz.Add(tOriginal);
                    continue;
                }

                //se factory lo segna
                if (TYPE_BIZ_FACTORY_INTERFACE.IsAssignableFrom(tOriginal))
                {
                    listFact.Add(tOriginal);
                    continue;
                }
            }

            //Crea oggetti business
            foreach (var item in listBiz)
            {
                //Crea entry business
                var entry = buildBizProxyEntry(item, outProxy);
                //Add a cache locale
                bizCacheLocal.Add(entry.TypeKey, entry);
            }

            //Crea i factory personalizzati
            foreach (var item in listFact)
            {
                //Recupera tipo biz base del factory
                var tFactGen = item.BaseType;

                if (!item.BaseType.IsGenericType)
                {
                    throw new ArgumentException(string.Format("Il tipo factory {0} non eredita da BusinessObjFactory<T>", item.Name));
                }

                var tBizBase = item.BaseType.GetGenericArguments()[0];

                //Crea istanza factory (1 sola volta per biz)
                IBusinessObjFactory fact = (IBusinessObjFactory)Activator.CreateInstance(item);

                //Ora cerca tutti i tipi che ereditano dal tipo generico di business trovato
                foreach (var tBiz in listBiz)
                {
                    //Cerca tutte le sottoclassi gia' caricate
                    if (!(tBiz.Equals(tBizBase) || tBiz.IsSubclassOf(tBizBase)))
                    {
                        continue;
                    }

                    var entry = bizCacheLocal[tBiz.TypeHandle.Value.ToInt64()];
                    entry.Factory = fact;
                }
            }
        }