Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 555|回复: 0

使用 ReSharper对.NET解决方案进行全面重构

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-1 16:15:28 | 显示全部楼层 |阅读模式

        ReSharper是面向微软开发环境Visual Studio(2005、2008、2010)的重构工具,对包含着众多项目的一个解决方案可作完美重构,只要按照正确的方法操作,诸如命名空间、程序集名称等都可顺利替换,最重要的是这一过程不会影响到各程序集间的引用关系。

        引用一段官网的说明:

    ReSharper is a renowned productivity tool that makes Microsoft Visual Studio a much better IDE. Thousands of .NET developers worldwide wonder how they've ever lived without ReSharper's code inspections, automated refactorings, blazing fast navigation, and coding assistance.

    翻译:

    ReSharper 是让微软 Visual Stuido 成为更好IDE(集成开发环境)的著名效能工具。遍布于世的成千上万.NET开发者无不为ReSharper的代码检查、自动重构、迅捷导航和代码辅助提示感到惊奇不已。(去官方网站瞧瞧)

       

        In meet the ReSharper before...(不好意思,马上切换到汉语状态)在发现 ReSharper 之前,我对项目的整体重构怀揣着强烈的敬畏之感,当默认命名空间、程序名称确定之后,在开发过程中根本不敢乱动,更别说项目的文件夹等名(一经修改,启动.sln后VS百分百出错,不过现在不怕了),唯恐VS在加载各项目时出现“某某程序不可用”等情况,更何况代码是受SVN的版控,一旦本地乱了套,那"提交"操作更是让人惶恐不安(吃不下、睡不香),即便公司有牛人帮咱顶着,但若屡次出现这般情况势必会在Team中给自己造成不好的印象。接下来我想说说ReSharper是怎么重构项目而统一命名,但在此之前需要对.NET解决方案的文件层次有个了解,先看一个截图,有个感性认识:

    image

         图片说明:有一主窗体程序Java.UI,还有一类库项目Java.Model,同时主窗体程序引用了类库项目。

    OK,我们现在重构的目标是:将所有以Java打头的名称,统统修改为NET打头。(不留任何死角喔!)

     

    以上解决方案的截图想必大家再熟悉不过,所以乍一听似乎没什么大不了,但你若想作全面修改、不留Bug、不留死角,嘿嘿,可没那么简单喔(^_^),接下来我们先对VS的文件架构作一下剖析,于是我将上述解决方案先作四个层面的划分:

      1. 基于 本地磁盘文件存放时呈现出的名称
            image

         

        图片说明:VS中每一个项目(Project)对应着本地磁盘的一个文件夹, 文件夹的名称在创建之初得以确认。需强调的是,其名称更改只能在本地磁盘相关文件夹上修改,VS无论如何也改不了,那么经我手动修改后造成的问题会在下文讲解。
             另外还有一个额外文件叫:_ReSharper.ReSharpterDemo,它是ReSharper临时生成的缓存文件,关闭VS后可手动删除。
      2. 基于VS解决方案整体架构名称:
            image 
            位于解决方案资源管理器上这两个项目的名称是可以随便更改的,且不会破坏引用关系(UI已引用了Model),编译也可顺利通过。值得注意的是一经修改它影响到的是.csproj文件的名称:
            image 
      3. 应用程序的默认命名空间、程序集名称: image

         

        图片说明:上图中的两个名称是用以限定生成的exe和dll文件的名称(他们位于bin/Debug或bin/Release中),如图:
            image
      4. 源代码中的各种相关名称,主要是using块的引用:
             
        image

         

              
            到此为止,我们已将解决方案的各个死角全部罗列清晰。
        --------------------------------------------------------------------------------------------------- 
            接下来我们一个一个解决: 
            ❶首先修改解决方案整体架构名称: 
          image

     image

            图片说明:通过这一步修改,VS整体架构名称得到了修正,与此同时两个项目的.csproj名称也一并修正,如图:

    image 图片说明:.csproj的新名称会自动同步到.sln文件中,所以下一次重新打开整个解决方案是没有任何问题的,不妨看一看.sln文件:

    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net.UI", "Java.UI\Net.UI.csproj", "{BF0E3C7D-8D79-4CBA-84B3-CEF490B98271}"
    EndProject
    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net.Model", "Java.Model\Net.Model.csproj", "{680B5493-8970-41E9-891A-92AF8216497E}"
    EndProject

     

     

     

     

     

             ❷接下来修改应用程序的程序集名和默认命名空间:

    image 图片说明:程序集名称会影响着bin/Debug文件夹中生成的exe或dll文件的名称。

            与此同时,ReSharper会在源代码提示命名空间的声明与文件位置(File Location)不一致,看看:

    image 图片说明:原先我们定义的命名空间名叫:Java.Model,而我们的修正期望结果是Net.Model,

    于是ReSharper给出了修正建议。(注:VS不会报错,编译可照常通过)

     

             ❸接下来该修改源代码,通过ReSharper统一修改源代码中的命名空间,而无需关心引用关系,即可以先对Java.Model进行名称修正,也可以先对Java.UI进行名称修正。值得一提的是Java.Model,因为它被外观层Java.UI所引用,一看便知:

    image图片说明: 可以将该处的Java.Model看作是命名空间的声明

     

    image图片说明:而该处的Java.Model便是引用

     

             只要在声明处,右键,"Refactor"-->"Rename"项:

    image

            弹出菜单作修改成Net.Model:

    image

            到了这一步,源代码中命名空间名称的"声明"和"引用"将完成一体化修正:

    image image 

             ❹文件夹名称修正:

             如果项目受SVN的版控,显然要通过SVN的右键菜单来修改文件夹名称,若是无版控,则可直接修改:

    image          修改为:

    image

     

              我们把VS关闭,重新开启,发现两个项目都不可用

    image

              这是因为文件夹名称修正后,.sln(Visual Studio.Solution)文件中的引用路径未经修正,尽管其他名称都是按预期的NET字样打头:

    # Visual Studio 2010
    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net.UI", "Java.UI\Net.UI.csproj", "{BF0E3C7D-8D79-4CBA-84B3-CEF490B98271}"
    EndProject
    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net.Model", "Java.Model\Net.Model.csproj", "{680B5493-8970-41E9-891A-92AF8216497E}"
    EndProject

     

              怎么修复呢?直接修改.sln吗?目前该解决方案中只有两个项目,手动修改很简便,但若是像PetShop项目有22个项目的话,那还能手动修改吗?显然行不通。我们把“不可用”的项目全部移除,然后“添加(D)”-->“现有项目(E)”,以此来重新构建.sln文件,如下图:

    image

              添加现有项目是件很有讲究的事情,因为项目间是有引用关系的,我可不想在添加完所有现有项目后,其包含的引用关系全部“断裂”,而导致我不得不重新引用一次,多浪费时间!也许您会说,这个浪费的时间,跟我去思考如何缕顺每一层的引用关系所花时间是一样一样的,那我得提醒你:引用关系的“断裂”意味着错误,而且添加重新引用时你也不得不弄清楚谁引用了哪些项目,但反过来缕顺关系按次序添加则是正确的做事方法

              我们知道 Net.UI 层引用了 Net.Model层,可见Net.Model是高层建筑的“基础”,故在添加现有项目时,得先引用Net.Model层。在这里,我且贴出先引用Net.UI时会出现的错误:

    image 图片说明:可以看到,未添加Net.Model时,引用项里会给出感叹号图标。

              先引用Net.Model,再引用Net.UI:

    image

              至此,一个解决方案的程序集名称、默认命名空间名称:从文件夹到项目文件(.csproj),再到bin生成文件(.exe和.dll),最后到源代码都一一重构完毕。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 21:55 , Processed in 0.109749 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表