Ejemplo n.º 1
0
 /// <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));
 }
Ejemplo n.º 2
0
        /// <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);
        }