• 解析大型.NET ERP系统 版本控制


    数据库版本控制

    1) 开发版本控制。控制多人同时修改数据库产生的冲突,使用SQL Source Control 工具做版本管理。

    SQL Server Management Studio支持VSS和TFS等作为数据库脚本的版本控制工具。

    关于SQL Source Control,参考以下地址 http://www.red-gate.com/products/sql-development/sql-source-control/

    2) 部署版本控制。将所有涉及数据库表结构变动的地方保存为SQL语句,依次用文件编号顺序编写。

    比如,系统参数表增加一个文件传输方式的字段,参考下面的脚本:

    --文件传输模式 XCOPY,FTP,HTTP
    IF NOT EXISTS(SELECT C.NAME FROM DBO.SYSCOLUMNS C, DBO.SYSOBJECTS O WHERE O.ID = C.ID AND O.NAME = 'CompanyParameter' AND  C.NAME = 'FileTransmissionMode')
    BEGIN
        Alter Table CompanyParameter ADD FileTransmissionMode nvarchar(1) NULL
    END
    GO

    将这些积累起来的数据变更脚本DML保存到一个带版本编号的SQL文件中,比如REV1710.sql。1710表示版本号,它的文件内容应该是这样的:

    EXEC  CheckVersion  'REV1710'
    Go
    
    --文件传输模式 XCOPY,FTP,HTTP
    IF NOT EXISTS(SELECT C.NAME FROM DBO.SYSCOLUMNS C, DBO.SYSOBJECTS O WHERE O.ID = C.ID AND O.NAME = 'CompanyParameter' AND  C.NAME = 'FileTransmissionMode')
    BEGIN
        Alter Table CompanyParameter ADD FileTransmissionMode nvarchar(1) NULL
    END
    GO
    
    EXEC  UpdateVersion  'REV1710'
    Go

    这个文件的设计模式包含三部分内容:

    1) 检查版本,检测当前数据库的版本是否是REV1709,不允许跳过版本升级。

    2) 执行更新语句,更新数据库。

    3) 修改当前数据库的版本为REV1710。

    数据库中的版本表定义如下,包含版本名称和升级日期:

    CREATE TABLE [dbo].[Version](
    [Recnum] [DECIMAL](18, 0) IDENTITY(1,1) NOT NULL,
    [Version] [NVARCHAR](8) NOT NULL,
    [ApplyDate] [DATETIME](50) NULL
     CONSTRAINT [PK_AgentConfiguration] PRIMARY KEY CLUSTERED 
    (
        [Version] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

     

    程序版本控制

    定义一个版本常量类型,用于所有程序集共享此版本变量。

    public sealed class AssemblyVersion
    {
           public const string Major = "2";
           public const string Minor = "4";
           public const string Build = "0";
           public const string Revision = "0";
    
           public const string Version = Major + "." + Minor + "." + Build + "." + Revision;
    }

    修改所有项目的版本信息文件AssemblyInfo.cs,设置版本信息为定义的常量值。

    [assembly: System.Reflection.AssemblyFileVersion(AssemblyVersion.FileVersion)]
    [assembly: System.Reflection.AssemblyVersion(AssemblyVersion.Version)]

    1 在程序启动时,检查程序当前目录中的程序集版本,发现不一致的程序集则应该抛出异常,停止启动程序。

    private static void VerifyAssembliesVersion()
    {
            string[] files = Directory.GetFiles(Application.StartupPath, "Enterprise.*.dll", SearchOption.TopDirectoryOnly);
            Parallel.ForEach<string>(files, file =>
            {
                    FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(file);
                  
                     if (string.CompareOrdinal(fileVersion.FileVersion, AssemblyVersion.FileVersion) != 0)
                     {
                           throw new AppException(string.Format("File version mismatch detected
    File: {0}
    Required Version: {1}
    Current Version: {2}",
                               new object[] { file.Replace(Application.StartupPath + "\", ""), AssemblyVersion.FileVersion, fileVersion.FileVersion }));
                     }               
             });
    }
     

    2  登入时,检测客户端程序的版本是否与服务器端的版本一致。C/S架构的程序,Client登入操作要判断Server端版本是否一致,不一致需要抛出异常,终止登入。

    3  功能的窗体基类检查版本,在这里也可以做与版本相关的签名判断。

    private void VerifyAssembly()
    {
         //System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
          startIndex = fullName.LastIndexOf("Version");
          version = fullName.Substring(startIndex, 15);
          versionNumber = str.LastIndexOf("Version");
          str = str.Substring(num2, 15);
          startIndex = fullName.LastIndexOf("PublicKeyToken");
          publickToken = fullName.Substring(startIndex, 31);
          num2 = str.LastIndexOf("PublicKeyToken");
          publickToken = str.Substring(num2, 31); 
    }

    取出程序集的全名(Assembly.GetCallingAssembly().FullName),逐个字符串判断版本是否一致。

    4 对于特殊类型的程序集,比如工作流,.NET CLR程序集,版本保持为永久一致。这两种类型的程序集需要序列化并存储到数据库中,当程序集在更新版本时,这类数据不会被修改。如果版本有变化,会导致找不到程序集错误。

    <WorkflowEntity WorkflowName="WFI001" Assembly="BusinessLogic, Version=5.5.0.0, Culture=neutral, PublicKeyToken=ea0fbbdb0910eab3" Type="BusinessLogic.EntityClasses.WorkflowEntity"><Fields><WorkflowName><CurrentValue Type="System.String">WFI001</CurrentValue><DbValue Type="System.String">WFI001</DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></WorkflowName><Description><CurrentValue Type="System.String">本日安全库存量</CurrentValue><DbValue Type="System.String">本日安全库存量</DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></Description><TableName><CurrentValue Type="System.String"></CurrentValue><DbValue Type="System.String"></DbValue><IsChanged>False</IsChanged><IsNull>False</IsNull></TableName><WorkflowType>

    在这个工作流定义中(XOML),版本是5.5.0.0,当升级到新的工作流版本后加载此工作流定义文件(XOML)会报错。
    BusinessLogic, Version=5.5.0.0, Culture=neutral, PublicKeyToken=ea0fbbdb0910eab3

    .NET CLR开发的SQL Server程序集也应按遵循此方法,使用固定的版本号。

    5  不同的.NET编译版本,需要附带相应的程序集缓存或安装工具。

    InstallUtil.exe  用于安装.NET程序集到系统服务中。

    GACUTIL.EXE 用于将.NET程序安装到系统全局缓存中。

    可以通过配置文件在运行时将旧版本的文件重定向到新版本,参考下面的配置节。

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <dependentAssembly>
                 <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1B03E6ACF1164F73" culture="neutral"/>
                    <bindingRedirect oldVersion="0.0.0.0-0.86.0.518" newVersion="0.86.0.518"/>
                </dependentAssembly>
        </assemblyBinding>
     </runtime>
     
     
  • 相关阅读:
    module(JS模块系统)
    Sass 教程
    Vue编写的页面部署到springboot网站项目中出现页面加载不全问题
    vue安装教程
    李大庆 软件工程 课后作业(一) 自我介绍
    课后作业(一)
    软工假期预习作业1
    浅谈C#中 加密方式
    C# 日志帮助类
    开荒笔记---UML类图之间的几种关系介绍
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/4753766.html
Copyright © 2020-2023  润新知