/// <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); }
/// <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; } } }