Esempio n. 1
0
        private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();

            AccesorsBuilder.RegisterAccesorsDependencies(container);
            BusinessBuilder.RegisterBusinessDependencies(container);
            SecurityBuilder.RegisterServiceDependencies(container);
            SecurityBuilder.RegisterProviderDependencies(container);

            App_Start.MvcUnityContainer.Container = container;

            Resolve(container);

            return(container);
        }
Esempio n. 2
0
        public string CreateAssemblyAttributes()
        {
            #region GetVersion

            Version ver = BusinessBuilder.GetVersion(AdmiralEnvironment.UserDefineBusinessFile);

            if (ver != null)
            {
                ver = new Version(ver.Major + 1, ver.Minor, ver.Build, ver.Revision);
            }
            else
            {
                ver = new Version(1, 0, 0, 0);
            }

            #endregion

            return($"[assembly: {typeof(AssemblyVersionAttribute).FullName}(\"{ver.ToString()}\")]\n");
        }
Esempio n. 3
0
        public void CreateAssembyInfoDocument()
        {
            #region GetVersion

            var ver = BusinessBuilder.GetVersion(AdmiralEnvironment.UserDefineBusinessFile);

            if (ver != null)
            {
                ver = new Version(ver.Major + 1, ver.Minor, ver.Build, ver.Revision);
            }
            else
            {
                ver = new Version(1, 0, 0, 0);
            }

            #endregion

            var str = $"[assembly: {typeof (AssemblyVersionAttribute).FullName}(\"{ver.ToString()}\")]\n";
            Workspace.AddDocument(ModuleProject.Id, "AssemblyInfo.cs", SourceText.From(str, Encoding.UTF8));
        }
Esempio n. 4
0
        /// <summary>
        /// 生成实体代码
        /// </summary>
        /// <param name="project"></param>
        /// <param name="schema"></param>
        public override void CreateEntityCode(ProjectConfig project, EntityConfig schema)
        {
            Message = schema.Caption;
            var path       = project.ModelPath;
            var entityPath = IOHelper.CheckPath(path, "DataModel");

            {
                var builder = new EntityBuilder
                {
                    Entity  = schema,
                    Project = project
                };
                builder.CreateBaseCode(entityPath);
                builder.CreateExtendCode(entityPath);
            }
            if (schema.IsClass)
            {
                return;
            }
            var exPath = IOHelper.CheckPath(path, "Extend");
            {
                var builder = new EntityExtendBuilder
                {
                    Entity  = schema,
                    Project = project
                };
                builder.CreateBaseCode(exPath);
                builder.CreateExtendCode(exPath);
            }
            var coPath = IOHelper.CheckPath(path, "Combo");
            {
                var builder = new EntityComboBuilder
                {
                    Entity  = schema,
                    Project = project
                };
                builder.CreateExtendCode(coPath);
            }

            var accessPath = IOHelper.CheckPath(path, "DataAccess");

            if (project.DbType == DataBaseType.MySql)
            {
                var builder = new MySqlAccessBuilder
                {
                    Entity  = schema,
                    Project = project
                };
                builder.CreateBaseCode(accessPath);
                builder.CreateExtendCode(accessPath);
            }
            else
            {
                var builder = new SqlServerAccessBuilder
                {
                    Entity  = schema,
                    Project = project
                };
                builder.CreateBaseCode(accessPath);
                builder.CreateExtendCode(accessPath);
            }
            //if (!string.IsNullOrEmpty(project.BusinessPath))
            {
                var businessPath =
                    IOHelper.CheckPath(
                        IOHelper.CheckPath(Solution.IsWeb ? project.ModelPath : project.BusinessPath,
                                           "Business"));
                var builder = new BusinessBuilder
                {
                    Entity  = schema,
                    Project = project
                };
                builder.CreateBaseCode(businessPath);
                builder.CreateExtendCode(businessPath);
            }

            var pg = new PageGenerator
            {
                Entity  = schema,
                Project = project
            };

            pg.CreateExtendCode(IOHelper.CheckPath(Solution.IsWeb ? project.ModelPath : project.BusinessPath));
            pg.CreateBaseCode(project.PagePath);
        }
        private void GenerateModuleAssembly()
        {
            #region GetVersion

            Version ver = BusinessBuilder.GetVersion(AdmiralEnvironment.UserDefineBusinessFile);

            if (ver != null)
            {
                ver = new Version(ver.Major + 1, ver.Minor, ver.Build, ver.Revision);
            }
            else
            {
                ver = new Version(1, 0, 0, 0);
            }

            #endregion

            var assemblyName = "AdmiralDynamicDC";
            var newFileName  = AdmiralEnvironment.UserDefineBusinessTempFile.FullName;

            #region 定义程序集

            var asmName = new AssemblyNameDefinition(assemblyName, ver);
            //[assembly: AssemblyFileVersionAttribute("1.0.0.12")]
            var assembly =
                AssemblyDefinition.CreateAssembly(
                    asmName,
                    "MainModule",
                    ModuleKind.Dll
                    );
            //AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Save, AdmiralEnvironment.UserDefineBusinessDirectoryInfo.FullName);

            #region 定义模块

            var module = assembly.MainModule;

            #endregion

            #endregion

            #region 设置文件版本

            var asmFileVerCtor = typeof(SR.AssemblyFileVersionAttribute).GetConstructor(new[] { typeof(string) });

            var asmFileVerCtorRef = assembly.MainModule.ImportReference(asmFileVerCtor);
            var ca = new Mono.Cecil.CustomAttribute(asmFileVerCtorRef);
            ca.ConstructorArguments.Add(new CustomAttributeArgument(
                                            assembly.MainModule.ImportReference(typeof(string)), ver.ToString()));
            assembly.CustomAttributes.Add(ca);

            #endregion

            #region XafModule

            var xafModule = new TypeDefinition("", "RuntimeModule",
                                               TypeAttributes.Public | TypeAttributes.Class,
                                               assembly.MainModule.ImportReference(typeof(RuntimeModuleBase)));

            //module.DefineType("RuntimeModule", TypeAttributes.Public | TypeAttributes.Class, typeof(RuntimeModuleBase));
            var ctor = new MethodDefinition(".ctor",
                                            MethodAttributes.Public
                                            | MethodAttributes.HideBySig
                                            | MethodAttributes.SpecialName
                                            | MethodAttributes.RTSpecialName,
                                            module.ImportReference(typeof(void))
                                            );
            //.method public hidebysig specialname rtspecialname instance void .ctor() cil managed

            //xafModule.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard | CallingConventions.HasThis, Type.EmptyTypes);
            var baseCtor = typeof(RuntimeModuleBase).GetConstructor(Type.EmptyTypes);

            var il = ctor.Body.Instructions;

            //.maxstack 8
            //L_0000: ldarg.0
            //L_0001: call instance void Admiral.ERP.Module.RuntimeModuleBase::.ctor()
            //L_0006: ret
            il.Add(Instruction.Create(OpCodes.Ldarg_0));
            il.Add(Instruction.Create(OpCodes.Call, module.ImportReference(baseCtor)));
            il.Add(Instruction.Create(OpCodes.Ret));
            xafModule.Methods.Add(ctor);
            module.Types.Add(xafModule);

            #endregion

            #region 创建业务对象
            var ObjectSpace = this.Application.CreateObjectSpace();
            var allTypes    = ObjectSpace.GetObjects <BusinessObjectBase>();

            var userDefinedBos = allTypes.OfType <BusinessObject>().Where(x => x.IsRuntimeDefine).ToList(); //ObjectSpace.GetObjects<BusinessObject>(new BinaryOperator("IsRuntimeDefine", true)).OrderBy(x => x.CreateIndex).ToArray();
            var dllTypes       = allTypes.Except(userDefinedBos);                                           //ObjectSpace.GetObjects<BusinessObject>(new BinaryOperator("IsRuntimeDefine", false));
            module.InitializeTypeReferences(dllTypes);



            //第一步只生成类型定义,是因为可能有交叉使用类型,如,基类是未定义的类型,则无法使用
            #region 定义类型生成的代码,包含属性修饰:-->[NonPersistent]pubic class {    }
            foreach (var bo in userDefinedBos)
            {
                var typeAtt = TypeAttributes.Class | TypeAttributes.Public;
                if (bo.IsAbstract)
                {
                    typeAtt |= TypeAttributes.Abstract;
                }
                else if (!bo.CanInherits)
                {
                    typeAtt |= TypeAttributes.Sealed;
                }

                var type = new TypeDefinition(bo.Category.FullName, bo.称, typeAtt);
                module.Types.Add(type);

                if (!bo.IsPersistent)
                {
                    type.AddNonPersistentDc();
                }

                if (bo.IsCloneable.HasValue)
                {
                    type.ModelDefault("IsCloneable", bo.IsCloneable.Value.ToString().ToLower());
                }

                if (bo.IsCreatableItem.HasValue)
                {
                    type.ModelDefault("IsCreatableItem", bo.IsCreatableItem.Value.ToString().ToLower());
                }

                if (bo.IsVisibileInReports.HasValue)
                {
                    type.VisibileInReport(bo.IsVisibileInReports.Value);
                }
                type.AddToTypeReferences(bo);
            }
            #endregion

            #region 生成剩下的内容
            foreach (var bo in userDefinedBos)
            {
                var type = bo.GetTypeDefintion();
                if (type == null)
                {
                    throw new Exception("错误!");
                }

                #region 处理基类

                var             boBaseType = bo.Base.GetTypeReference() ?? module.ImportReference(typeof(SimpleObject));
                MethodReference boBaseCtor;

                if (boBaseType.HasGenericParameters)
                {
                    type.BaseType = boBaseType.MakeGenericType(bo.GenericParameters.Select(gp => gp.ParameterValue.GetTypeReference()).ToArray());

                    //var tb = boBaseType.Resolve().MakeGenericType(bo.GenericParameters.Select(gp => gp.ParameterValue.FindType(typeReferences)).ToArray());

                    boBaseCtor =
                        //(tb as TypeDefinition).Methods.Single(x => x.Name == ".ctor" && x.Parameters.First().ParameterType.FullName == typeof(Session).FullName);
                        module.ImportReference(
                            type.BaseType.Resolve()
                            .Methods.Single(
                                x => x.Name == ".ctor" && x.Parameters.First().ParameterType.FullName == typeof(Session).FullName)
                            );
                    boBaseCtor = boBaseCtor.MakeGeneric(bo.GenericParameters.Select(gp => gp.ParameterValue.GetTypeReference()).ToArray());
                }
                else
                {
                    type.BaseType = boBaseType;
                    boBaseCtor    = module.ImportReference(
                        boBaseType.Resolve().Methods.Single(x => x.Name == ".ctor" && x.Parameters.Count == 1 && x.Parameters.Single().ParameterType.FullName == typeof(Session).FullName)
                        );
                }

                if (boBaseCtor != null)
                {
                    var boctor = new MethodDefinition(".ctor",
                                                      MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.RTSpecialName,
                                                      //CallingConventions.Standard | CallingConventions.HasThis,
                                                      module.ImportReference(typeof(void))
                                                      );
                    // type.DefineConstructor(MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.RTSpecialName, CallingConventions.Standard | CallingConventions.HasThis, new Type[] { typeof(Session) });
                    var p = new ParameterDefinition("session", ParameterAttributes.None, module.ImportReference(typeof(Session)));
                    boctor.Parameters.Add(p);
                    var boil = boctor.Body.GetILProcessor();
                    //.GetILGenerator();

                    boil.Emit(OpCodes.Ldarg_0);
                    boil.Emit(OpCodes.Ldarg_1);
                    boil.Emit(OpCodes.Call, boBaseCtor);
                    boil.Emit(OpCodes.Nop);
                    boil.Emit(OpCodes.Nop);
                    boil.Emit(OpCodes.Ret);

                    //L_0000: ldarg.0
                    //L_0001: ldarg.1
                    //L_0002: call instance void IMatrix.ERP.Module.BusinessObjects.订单`1 <class IMatrix.ERP.Module.BusinessObjects.PMS.采购订单明细>::.ctor(class [DevExpress.Xpo.v15.2]
                    //DevExpress.Xpo.Session)
                    //L_0007: nop
                    //L_0008: nop
                    //L_0009: ret

                    //.method public hidebysig specialname rtspecialname
                    //instance void  .ctor(class ['DevExpress.Xpo.v15.2']DevExpress.Xpo.Session session) cil managed
                    //{
                    //// 代码大小       10 (0xa)
                    //.maxstack  8
                    //IL_0000:  ldarg.0
                    //IL_0001:  ldarg.1
                    //IL_0002:  call       instance void [IMatrix.ERP.Module]IMatrix.ERP.Module.BusinessObjects.'订单`1'::.ctor<class '业务'.'采购计划明细'>(class ['DevExpress.Xpo.v15.2']DevExpress.Xpo.Session)
                    //IL_0007:  nop
                    //IL_0008:  nop
                    //IL_0009:  ret
                    //} // end of method '采购计划'::.ctor

                    type.Methods.Add(boctor);
                }

                #endregion

                #region 填加属性

                foreach (var p in bo.Properties)
                {
                    BuildPropertyCore(p, type);
                }

                #endregion

                #region 填加集合属性
                foreach (var item in bo.CollectionProperties)
                {
                    BuildCollectionProperty(item, type);
                }
                #endregion
            }
            #endregion

            #endregion

            #region 保存生成的程序集
            assembly.Write(newFileName);
            #endregion

            #region  除模块信息,让系统执行更新表结构动作

            var moduleInfo = ObjectSpace.FindObject <ModuleInfo>(new BinaryOperator("Name", "RuntimeModule"));
            if (moduleInfo != null)
            {
                ObjectSpace.Delete(moduleInfo);
                ObjectSpace.CommitChanges();
            }
            var restart = Application as IRestartApplication;
            if (restart != null)
            {
                restart.RestartApplication();
            }
            #endregion
        }
Esempio n. 6
0
        private void GenerateModuleAssembly()
        {
            #region GetVersion

            Version ver = BusinessBuilder.GetVersion(AdmiralEnvironment.DomainComponentDefineFile);

            if (ver != null)
            {
                ver = new Version(ver.Major + 1, ver.Minor, ver.Build, ver.Revision);
            }
            else
            {
                ver = new Version(1, 0, 0, 0);
            }

            #endregion

            var assemblyName = "AdmiralDynamicDC";
            var newFileName  = assemblyName + ver + ".dll";

            #region 定义程序集

            var asmName = new AssemblyName(assemblyName)
            {
                Version = ver
            };
            //[assembly: AssemblyFileVersionAttribute("1.0.0.12")]
            var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Save, AdmiralEnvironment.DomainComponentDefineDirectory.FullName);

            #region 定义模块

            var module = assembly.DefineDynamicModule(assemblyName, newFileName);

            #endregion

            #endregion

            #region 设置文件版本

            var asmFileVerCtor = typeof(AssemblyFileVersionAttribute).GetConstructor(new[] { typeof(string) });

            var asmFileVer = new CustomAttributeBuilder(asmFileVerCtor, new object[] { ver.ToString() });

            assembly.SetCustomAttribute(asmFileVer);

            #endregion

            #region XafModule

            var xafModule = module.DefineType("RuntimeModule", TypeAttributes.Public | TypeAttributes.Class, typeof(RuntimeModuleBase));
            var ctor      = xafModule.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard | CallingConventions.HasThis, Type.EmptyTypes);
            var baseCtor  = typeof(RuntimeModuleBase).GetConstructor(Type.EmptyTypes);

            var il = ctor.GetILGenerator();

            //.maxstack 8
            //L_0000: ldarg.0
            //L_0001: call instance void Admiral.ERP.Module.RuntimeModuleBase::.ctor()
            //L_0006: ret
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Call, baseCtor);
            il.Emit(OpCodes.Ret);
            xafModule.CreateType();

            #endregion

            #region 创建业务对象

            var bos = ObjectSpace.GetObjects <IBusinessObject>(new BinaryOperator("IsRuntimeDefine", true)).OrderBy(x => x.CreateIndex).ToArray();

            var types = new Dictionary <IBusinessObjectBase, TypeBuilder>();

            foreach (var bo in bos)
            {
                var type = module.DefineType("BusinessObject." + bo.BusinessObjectName, TypeAttributes.Interface | TypeAttributes.Public | TypeAttributes.Abstract);


                AddDomainAttribute(type, bo.RegisterType);

                if (!bo.IsPersistent)
                {
                    AddNonPersistentDc(type);
                }

                if (bo.DefaultProperty != null)
                {
                    AddDefaultProperty(type, bo.DefaultProperty);
                }
                if (bo.NavigationGroup != null)
                {
                    AddNavigationItem(type, bo.NavigationGroup.Name);
                }

                if (!string.IsNullOrEmpty(bo.Caption))
                {
                    type.ModelDefault("Caption", bo.Caption);
                }

                if (bo.Icon != null)
                {
                    type.ModelDefault("ImageName", bo.Icon.ImageName);
                }
                else
                {
                    type.ModelDefault("ImageName", "BO_Unknown");
                }

                if (bo.IsCloneable.HasValue)
                {
                    type.ModelDefault("IsCloneable", bo.IsCloneable.Value.ToString().ToLower());
                }
                if (bo.IsCreatableItem.HasValue)
                {
                    type.ModelDefault("IsCreatableItem", bo.IsCreatableItem.Value.ToString().ToLower());
                }
                if (bo.IsVisibileInReports.HasValue)
                {
                    type.VisibileInReport(bo.IsVisibileInReports.Value);
                }
                types.Add(bo, type);
            }

            foreach (var bo in bos)
            {
                var type = types[bo];

                #region 处理基类

                foreach (var bi in bo.Bases)
                {
                    type.AddInterfaceImplementation(ImportTypeReference(bi, types));
                }

                #endregion

                #region 填加属性

                foreach (var p in bo.Properties)
                {
                    p.BuildProperty(type, types);
                }

                #endregion

                try
                {
                    type.CreateType();
                }
                catch (Exception ex)
                {
                    throw new Exception("创建类" + type.Name + "时出错:" + ex.Message);
                }
            }

            #endregion

            #region 保存生成的程序集

            assembly.Save(newFileName);
            File.WriteAllText(AdmiralEnvironment.DomainComponentDefineConfig.FullName, AdmiralEnvironment.DomainComponentDefineDirectory.FullName + "\\" + newFileName);

            #endregion

            #region  除模块信息

            var moduleInfo = ObjectSpace.FindObject <ModuleInfo>(new BinaryOperator("Name", "ERPModule"));
            if (moduleInfo != null)
            {
                ObjectSpace.Delete(moduleInfo);
                ObjectSpace.CommitChanges();
            }

            #endregion
        }
Esempio n. 7
0
 public BusinessMaker(BusinessBuilder aBuilder)
 {
     _builder = aBuilder;
 }
Esempio n. 8
0
 public void ProcessRequest(HttpContext context)
 {
     BusinessBuilder.Reset();
     HttpRuntime.UnloadAppDomain();
     //Thread.CurrentThread.Abort();
 }