/// <summary> /// Recupera o método para apagar a entidade. Caso a entidade seja nula retornar um método válido. /// </summary> /// <param name="entity"></param> /// <returns></returns> public static Func <Data.IPersistenceSession, Business.DeleteResult> GetDeleteMethod(this Business.IEntity entity) { if (entity != null) { return(entity.Delete); } return(session => new Colosoft.Business.DeleteResult(true, null)); }
/// <summary> /// Cria a model que será usada na vinculação. /// </summary> /// <param name="controllerContext"></param> /// <param name="bindingContext"></param> /// <param name="modelType"></param> /// <returns></returns> protected override object CreateModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext, Type modelType) { var getMethodName = _getMethodName ?? string.Format("Get{0}", modelType.Name); var methods = _flowType.GetMethods(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); var getMethods = methods.Where(f => f.Name == getMethodName).ToArray(); var loader = EntityTypeManager.GetLoader(modelType); System.Reflection.MethodInfo getMethod = null; if (getMethods.Length == 1) { getMethod = getMethods[0]; } else if (loader.HasUid) { foreach (var method in getMethods) { var methodParameters = method.GetParameters(); if (methodParameters.Length == 1 && methodParameters[0].ParameterType == typeof(int)) { getMethod = method; break; } } } if (getMethod == null) { throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.EntityBinder_GetMethodNotFound, getMethodName, _flowType.FullName).Format()); } var descriptor = GetTypeDescriptor(controllerContext, bindingContext); var record = GetRecordOfKey(controllerContext, bindingContext, modelType); var flow = GetFlowInstance(); if (loader.HasUid && record.GetInt32(loader.UidPropertyName) <= 0) { return(CreateEntity(flow, modelType)); } object[] parameters = null; if (record.Descriptor.Count == 1) { parameters = new object[] { record.GetInt32(0) } } ; else { var methodParameters = getMethod.GetParameters(); parameters = new object[methodParameters.Length]; for (var i = 0; i < parameters.Length; i++) { var key = record.Descriptor.FirstOrDefault(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.Name, methodParameters[i].Name)); if (key == null && methodParameters[i].Name == "id" && loader.HasUid) { key = record.Descriptor.FirstOrDefault(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.Name, loader.UidPropertyName)); } if (key != null) { parameters[i] = Colosoft.Reflection.TypeConverter.Get(methodParameters[i].ParameterType, record.GetValue(key.Name)); } ; } } Business.IEntity entity = null; try { entity = (Business.IEntity)getMethod.Invoke(flow, parameters); } catch (System.Reflection.TargetInvocationException ex) { throw ex.InnerException; } if (entity == null) { entity = CreateEntity(flow, modelType); } if (entity.Uid == 0) { entity.Uid = entity.TypeManager.GenerateInstanceUid(modelType); } return(entity); }