private Assembly BuildAssembly(JsonCalculationRequestModel calculationRequestModel)
        {
            var sourceCode = BuildAssemblySourceCode(calculationRequestModel);
            var assembly   = _objectBuilder.BuildAssembly(sourceCode);

            return(assembly);
        }
Пример #2
0
 public HttpResponseMessage Calculate(JsonCalculationRequestModel calculationRequest)
 {
     try
     {
         var calculationModelResponse = _calculationServiceAdapter.Calculate(calculationRequest);
         return(Request.CreateResponse(HttpStatusCode.OK, calculationModelResponse));
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
         return(Request.CreateResponse(HttpStatusCode.InternalServerError, new { Error = e.Message }));
     }
 }
        private string BuildAssemblySourceCode(JsonCalculationRequestModel calculationRequestModel)
        {
            var sourceCodeBuilder = new JsonSourceCodeBuilder();

            foreach (var calculationObject in calculationRequestModel.CalculationObjects)
            {
                var schema = calculationObject.Schema;
                if (string.IsNullOrWhiteSpace(schema))
                {
                    var dataJson = calculationObject.Data.ToString(Formatting.None);
                    sourceCodeBuilder.AddJsonData(calculationObject.RootClassName, dataJson);
                }
                else
                {
                    sourceCodeBuilder.AddJsonSchema(calculationObject.RootClassName, calculationObject.Schema);
                }
            }

            var sourceCode = sourceCodeBuilder.Build();

            return(sourceCode);
        }
        public CalculationModelResponse Calculate(JsonCalculationRequestModel calculationRequestModel)
        {
            var assembly = BuildAssembly(calculationRequestModel);

            var           objectInfos        = new List <CalculationObjectInfo>();
            List <object> calculationObjects = new List <object>();

            foreach (var calculationObject in calculationRequestModel.CalculationObjects)
            {
                var objectType = assembly.GetType($"Theia.{calculationObject.RootClassName}");
                if (calculationObject.Data is JArray)
                {
                    Type genericListType = typeof(List <>).MakeGenericType(objectType);
                    var  listType        = Activator.CreateInstance(genericListType).GetType();
                    calculationObjects.AddRange(((IList)calculationObject.Data.ToObject(listType)).Cast <object>());
                }
                else if (calculationObject.Data is JObject)
                {
                    calculationObjects.Add(calculationObject.Data.ToObject(objectType));
                }
                objectInfos.Add(new CalculationObjectInfo(calculationObject.RootClassName, objectType));
            }
            var types = objectInfos.Select(x => x.Type).ToList();
            var countExequtedRules = Calculate(assembly, types, calculationRequestModel.Rules, calculationObjects);

            var response = new CalculationModelResponse {
                FiredRules = countExequtedRules
            };

            foreach (var objectInfo in objectInfos)
            {
                var data = calculationObjects.OfType(objectInfo.Type).ToList();
                response.CalculationObjects.Add(new CalculationObjectModel <object> {
                    Data = data, RootClassName = objectInfo.RootClassName
                });
            }

            return(response);
        }