在VS中通过建立依赖关系使文件结构更清晰

时间:2021-10-16 10:19:56

在一个Web应用中,当你添加一个Web页面的时候,VS实际上会为你创建三个文件:Xxx.aspx, Xxx.aspx.cs和Xxx.aspx.designer.cs,后面两个文件(依赖文件)依赖于第一个文件(主文件)。依赖文件嵌套在主文件下,在结构上看起来非常的清晰。那么你是否可以把存在于同一个目录下的两个相关的文件也建立这种依赖关系呢?

目录
一、文件依赖达到的效果
二、文件依赖关系定义在Project文件中
三、通过VS插件建立两个文件之间的依赖关系

 

一、文件依赖达到的效果

对于项目文件之间的依赖关系,包含HTML的.aspx文件和包含Code Behind的.cs(或者.vb)文件是我们遇到的最为常见的表现形式。实际上还有其他的表现形式,比如资源文件(.resx文件)和自动生成的代码文件,Windows窗体文件和基于该窗体的资源文件(.resx)等。在创建这些文件的时候,VS会默认为你创建一套具有依赖关系的文件。

在VS中通过建立依赖关系使文件结构更清晰除了这种VS自动支持的文件依赖之外,有的时候我们需要手工为添加在同一个目录下的两个文件建立依赖关系。比如如果我们采用MVP模式进行开发的时候,建立一个View的时候,往往需要为之创建一个Presenter。在默认的情况下,View和Presenter在VS中处于同一个级别,如果能够建立起它们之间的依赖关系,让Presenter文件嵌套在View文件下,在结构上将显得更加清晰(如左图所示)。在VS中通过建立依赖关系使文件结构更清晰

再举一个例子,在《如何让ASP.NET默认的资源编程方式支持非.ResX资源存储》一文中,我提供了一种通过自定义ResourceProvider让ASP.NET默认的资源编成模式支持不同形式的资源存储形式。现在我们为了实现本地化的需要,需要为每一个.aspx创建基于不同语言文化的资源文件,假设我们采用XML文件。如果我们能够让这些资源文件作为.aspx文件的依赖文件,那么它们显示在Solution Explorer中就会呈现出一种层级关系,看起来会显得结构清晰(如右图所示)。

具有依赖关系的文件之间除了显示效果之外还具有一些额外的属性,比如当你删除主文件的时候,所有的依赖文件都会自动被删除;当你使用TFS作为Source Control的时候,签出主文件的同时也会将所有依赖文件全部签出。

二、文件依赖关系定义在Project文件中

在目录结构来讲,主文件和依赖文件处于相同的层级,它们的依赖关系实际上是通过Project文件(.csproj文件或者.vbproj文件)来定义的。Project文件本质上就是一个XML文件,所有包含在项目中的文件在<ItemGroup>元素下具有一个子元素。一般来说,需要编译的文件(比如.cs或者.vb文件)以一个<Compile/>元素表示,其它的则表示成<Content/>元素。而某个文件具体依赖于哪个文件,通过子元素<DependentUpon/>定义。比如说针对上图所示的文件结构,三个资源文件(Default.aspx.xml、Default.aspx.en-US.xml和Default.aspx.zh-CN.xml)以来于Default.aspx,这样的依赖关系体现在如下所示的Project文件中。

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   3:   <!--Other Content-->
   4:   <ItemGroup>
   5:     <Content Include="Default.aspx" />
   6:     <Content Include="Default.aspx.xml">
   7:       <DependentUpon>Default.aspx</DependentUpon>
   8:     </Content>
   9:     <Content Include="Default.aspx.en-US.xml">
  10:       <DependentUpon>Default.aspx</DependentUpon>
  11:     </Content>
  12:     <Content Include="Default.aspx.zh-CN.xml">
  13:       <DependentUpon>Default.aspx</DependentUpon>
  14:     </Content>
  15:   </ItemGroup>
  16:   <!--Other Content-->
  17: </Project>

换句话说,如果你需要两个文件具有依赖创建,通过修改对应.csproj文件(或者.vbproj文件)完全可以达到你的目的。但是这样的方式在操作性上是极不方便的,那么是否具有更好的方法呢?

三、通过VS插件建立两个文件之间的依赖关系

实际上,关于方便建立两个项目文件之间的依赖关系,网上有很多开源的VS插件。如果你对VS扩展开发比较熟悉,你甚至可以自己开发。由于我对此一窍不通,所以只能寻找现有的工具,我发现有一款叫作IStaySharp.CreateDependency的工具不错。IStaySharp.CreateDependency提供了一个VS宏,你将它加载到VS中,基于此创建对应的工具栏命令。然后再Solution Exploror选择两个项目文件,点击该工具栏按钮即可。这个VS宏文件你可以通过这里直接下载,这里还提供一个很短的视频为你展示了相关的安装、使用过程。