Ejemplo n.º 1
0
        private void WriteChildren()
        {
            var em       = this.EntityMeta;
            var children = em.ChildrenProperties;

            for (int i = 0, c = children.Count; i < c; i++)
            {
                var child = children[i];

                var listProperty = child.ManagedProperty as IListProperty;
                if (listProperty.HasManyType == HasManyType.Composition)
                {
                    var pRefMeta = child.ChildType.FindParentReferenceProperty();
                    if (pRefMeta != null)
                    {
                        var childType   = child.ChildType.EntityType;
                        var association = new HasManyAssociation
                        {
                            name       = child.Name,
                            foreignKey = (pRefMeta.ManagedProperty as IRefProperty).RefIdProperty.Name,
                            model      = ClientEntities.GetClientName(childType),
                        };
                        _entityModel.associations.Add(association);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private void WriteTreeAssociations()
        {
            var supportTree = this.EntityMeta.IsTreeEntity;

            if (supportTree)
            {
                foreach (var property in this.EntityMeta.EntityProperties)
                {
                    if (property.ManagedProperty == Entity.TreePIdProperty)
                    {
                        _entityModel.associations.Add(new BelongsToAssociation
                        {
                            associationKey = "TreeParent",
                            foreignKey     = property.Name,
                            model          = ClientEntities.GetClientName(this.EntityMeta.EntityType),
                        });
                        _entityModel.associations.Add(new HasManyAssociation
                        {
                            name       = "TreeChildren",
                            foreignKey = property.Name,
                            model      = ClientEntities.GetClientName(this.EntityMeta.EntityType),
                        });

                        break;
                    }
                }
            }
        }
Ejemplo n.º 3
0
        private static ModuleJson ToJson(WebModuleMeta module)
        {
            var mJson = new ModuleJson
            {
                keyLabel = module.KeyLabel
            };

            if (module.HasUI)
            {
                if (module.IsCustomUI)
                {
                    mJson.url = module.Url;
                }
                else
                {
                    mJson.model         = ClientEntities.GetClientName(module.EntityType);
                    mJson.clientRuntime = module.ClientRuntime;
                    mJson.viewName      = module.AggtBlocksName;
                }
            }

            foreach (WebModuleMeta child in module.Children)
            {
                var childJson = ToJson(child);
                mJson.children.Add(childJson);
            }

            return(mJson);
        }
Ejemplo n.º 4
0
        private static void ConvertParametersType(ParameterInfo[] methodParameters, object[] parameters)
        {
            for (int i = 0; i < parameters.Length; i++)
            {
                var mp = methodParameters[i];
                var p  = parameters[i];

                var mpType = mp.ParameterType;

                //任意参数都不能为 null
                if (p == null)
                {
                    if (mpType == typeof(string))
                    {
                        p = string.Empty;
                    }
                    else
                    {
                        p = TypeHelper.GetDefaultValue(mpType);
                    }

                    parameters[i] = p;
                }

                //如果需要的参数是一个类型,而提供的参数是一个字符串,则通过字符串查找并转换为对应的实体类型。
                if (mpType == typeof(Type) && p is string)
                {
                    var em = ClientEntities.Find(p as string);
                    if (em != null)
                    {
                        parameters[i] = em.EntityType;
                    }
                }
            }
        }
Ejemplo n.º 5
0
        protected override string ResponseScript(HttpContext context)
        {
            var request = context.Request;

            var strType = request.QueryString["type"];

            if (string.IsNullOrEmpty(strType))
            {
                return(string.Empty);
            }

            var meta = ClientEntities.Find(strType);

            JsonModel res = null;

            if (context.Request.HttpMethod == "GET")
            {
                var evm = UIModel.Views.CreateBaseView(meta.EntityType);
                res = this.QueryEntityList(request, evm);
            }
            else
            {
                res = this.SaveEntityList(request, meta);
            }

            var js = res.ToJsonString();

            return(Compress(js));
        }
Ejemplo n.º 6
0
        private static Criteria ParseCriteria(JArray filters, PagingInfo pagingInfo)
        {
            JObject jUseCriteriaType = filters[0] as JObject;
            var     clientTypeName   = jUseCriteriaType.Property("value").Value.ToString();
            var     criteriaMeta     = ClientEntities.Find(clientTypeName);

            if (criteriaMeta == null)
            {
                throw new NotSupportedException("criteriaType");
            }

            var jCriteria = filters[1] as JObject;

            if (!jCriteria.Property("property").Value.ToString().Contains("_criteria"))
            {
                throw new NotSupportedException();
            }
            var jCriteriaValues = jCriteria.Property("value").Value as JObject;

            //创建一个 Criteria 并设置它的相关属性值
            var criteria = Entity.New(criteriaMeta.EntityType) as Criteria;

            if (criteria == null)
            {
                throw new InvalidProgramException("在 Web 开发模式下,查询条件类,必须继承自 Criteria 类型。");
            }

            var setter = new EntityPropertySetter(criteriaMeta);

            setter.SetEntity(criteria, jCriteriaValues);

            criteria.PagingInfo = pagingInfo;

            return(criteria);
        }
Ejemplo n.º 7
0
        private static void GenerateClientEntities(StringBuilder buffer)
        {
            var emg = new EntityModelGenerator();

            foreach (var kv in ClientEntities.GetEntities())
            {
                emg.EntityMeta = kv.Value;

                var model = emg.Generate();

                var jsonConfig = model.ToJsonString();

                var js = string.Format(@"Rafy._dm('{0}', {1});", kv.Key, jsonConfig);

                buffer.AppendLine(js);
            }
        }
Ejemplo n.º 8
0
        private void WriteReference()
        {
            var properties = this.EntityMeta.EntityProperties;

            for (int i = 0, c = properties.Count; i < c; i++)
            {
                var property    = properties[i];
                var refProperty = property.ManagedProperty as IRefEntityProperty;
                if (refProperty != null)
                {
                    var association = new BelongsToAssociation
                    {
                        associationKey = refProperty.RefEntityProperty.Name,
                        foreignKey     = refProperty.RefIdProperty.Name,
                        model          = ClientEntities.GetClientName(refProperty.RefEntityType),
                    };

                    _entityModel.associations.Add(association);
                }
            }
        }
Ejemplo n.º 9
0
        private static object ConvertOutputComponent(object value)
        {
            //服务的输出属性如果类型是一个实体或者实体列表,则需要进行格式转换。
            if (value is IDomainComponent)
            {
                var model = (value as IDomainComponent).GetRepository().EntityType;

                //TODO:这里可能存在问题:当一个非默认的视图请求这个服务得到一个默认视图的实体数据时,可能会因为列不一致而出现问题。
                var defaultVM = UIModel.Views.CreateBaseView(model);

                if (value is EntityList)
                {
                    var listRes = new EntityJsonList {
                        model = model
                    };

                    EntityJsonConverter.EntityToJson(defaultVM, value as EntityList, listRes.entities);
                    listRes.total = listRes.entities.Count;

                    value = listRes;
                }
                else if (value is Entity)
                {
                    var entityJson = new EntityJson();
                    EntityJsonConverter.EntityToJson(defaultVM, value as Entity, entityJson);

                    //在纯数据的基础上添加以下两个约定的属性:标记这是一个实体以及它在客户端的类型名称。
                    entityJson.SetProperty(Consts.isEntityProperty, BooleanBoxes.True);
                    entityJson.SetProperty(Consts.modelProperty, ClientEntities.GetClientName(model));

                    value = entityJson;
                }
                else
                {
                    throw new NotSupportedException("只支持对实体、实体列表进行格式转换。");
                }
            }

            return(value);
        }
Ejemplo n.º 10
0
        protected override string ResponseScript(HttpContext context)
        {
            var request = context.Request;

            var converter = new ClientMetaFactory();
            var op        = converter.Option;

            op.ignoreCommands = request.GetQueryStringOrDefault("ignoreCommands", 0) == 1;
            op.isDetail       = request.GetQueryStringOrDefault("isDetail", 0) == 1;
            op.isLookup       = request.GetQueryStringOrDefault("isLookup", 0) == 1;
            op.isReadonly     = request.GetQueryStringOrDefault("isReadonly", 0) == 1;
            op.viewName       = request.GetQueryStringOrDefault("viewName", string.Empty);
            var moduleName   = request.GetQueryStringOrDefault("module", string.Empty);
            var typeName     = request.GetQueryStringOrDefault("type", string.Empty);
            var templateType = request.GetQueryStringOrDefault("templateType", string.Empty);
            var isAggt       = request.GetQueryStringOrDefault("isAggt", 0) == 1;

            JsonModel jsonResult = null;

            //如果指定了 module,则直接返回模块的格式。
            if (!string.IsNullOrEmpty(moduleName))
            {
                var module = CommonModel.Modules[moduleName];
                var aggt   = UIModel.AggtBlocks.GetModuleBlocks(module);
                jsonResult = converter.ConvertToAggtMeta(aggt);
            }
            else
            {
                var type = ClientEntities.Find(typeName);

                //需要聚合块
                if (isAggt)
                {
                    AggtBlocks aggt = null;
                    //通过定义的模板类来返回模块格式
                    if (!string.IsNullOrEmpty(templateType))
                    {
                        var uiTemplateType = Type.GetType(templateType);
                        var template       = Activator.CreateInstance(uiTemplateType) as BlocksTemplate;
                        template.EntityType = type.EntityType;
                        aggt = template.GetBlocks();
                    }
                    else
                    {
                        //通过定义的聚合块名称来获取聚合块
                        if (!string.IsNullOrEmpty(op.viewName))
                        {
                            aggt = UIModel.AggtBlocks.GetDefinedBlocks(op.viewName);
                        }
                        else
                        {
                            //通过默认的聚合块名称来获取聚合块
                            aggt = UIModel.AggtBlocks.GetDefaultBlocks(type.EntityType);
                        }
                    }

                    jsonResult = converter.ConvertToAggtMeta(aggt);
                }
                else
                {
                    //获取单块 UI 的元数据
                    var evm = UIModel.Views.Create(type.EntityType, op.viewName) as WebEntityViewMeta;

                    jsonResult = converter.ConvertToClientMeta(evm);
                }
            }

            var json = jsonResult.ToJsonString();

            return(json);
        }