分类 编程 下的文章

20分钟读懂程序集(3)

<div><p>(2)部署GAC--强命名</p><p>部署到GAC之前,一定要给这个程序集赋一个强命名,它就像是.NET中的GUID,是一个唯一标识符。它的作用是用于标识给定.NET二进制文件的发行者。</p><p>强命名的组成包括:</p><ul> <li>程序集的友好名称</li> <li>程序集的版本号</li> <li>公钥值</li> <li>等等。。 <div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div> </li></ul><p>那怎么生成强命名呢?有2种方法,一种是命令形式,另外一个VS 图形化,最后的时候附带上。</p><p>①生成强命名文件</p><p>sn.exe 工具生成一个文件 以 *.snk(strong name key)后缀的文件。</p><p>语法是:</p><blockquote><p>sn -k 文件名.snk</p></blockquote><p></p><p>②把强命名文件放进程序中</p><p>我们只需要把刚我们myTestKey.snk 告诉编译器就好了。那怎么告诉呢?就是把信息写进AssemblyInfo.cs 文件。</p><p></p><p>③安装强命名的程序集</p><p>我们需要使用gacutil.exe 工具。</p><blockquote><p>安装:gacutil.exe -i 程序集名称</p><p>查看:gacutil.exe -l 程序集名称</p><p>卸载:gacutil.exe -u 程序集名称</p></blockquote><p></p><p>现 在我们打开“C:Windowsassembly”的时候,我们并没有找到刚MyLibrary.dll。原来在.NET 4中,GAC 被分在2个地方。.NET 1.0 到.NET 3.5的基础类库 就放到“C:Windowsassembly”这里。而且.NET 4 编译下的程序集,是放到“C:WindowsMicrosoft.NETassemblyGAC_MSIL&rdquo;中。。</p><p></p><p>3.3 使用共享GAC</p><p>那我们就导入就好了!!。如果我们导入了一个共享的GAC,这个时候 我们没法再本地程序集下面找到这个程序集,只能在刚我们所说的位置。</p><p>3.4图形化配置GAC</p><p>①打开properties</p><p></p><p>我们选择 <New ...></p><p>②创建强命名文件</p><p></p><p>③显示</p><p></p></div>

- 阅读剩余部分 -

20分钟读懂程序集(2)

<div><p>三。程序集的分类</p><p>程序集分为私有程序集和共享程序集</p><p>3.1私有程序集。</p><p>(1)啥是私有程序集。顾名思义,私 就是 私有的意思。就是我们新建的项目库中保留的dll 都是私有程序集。比如,在我其中一个MyTestConsle的项目,在Bin/Debug里面都是私有程序集。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p></p><p>(2)配置私有程序集(probing 属性)</p><p>一般情况下,我们需要dll,直接copy过去,是的,这样很方便。但是,有的时候,我们需要把dll放到不同的文件中,那么这个时候,就需要进行配置。别担心,特别的简单哦。</p><p>比如,我们在C盘下面新建一个 MyTest的文件夹。我把刚的2个程序拷到这里来,并且点击MyTestProject.exe,Ok,可以运行 这样没问题。。</p><p></p><p>但是,如果我新建一个“MyAllLibraries”文件夹,把我的Lanny.dll 文件放进去,如下图,那我运行,我们都知道 肯定会报错</p><p></p><p>咋办呢?这个时候就需要我们去配置了。我们在MyTestProject.exe同级下新建一个“MyTestProject.exe.config”文件。入下图:</p><p></p><p>MyTestProject.exe.config的内容是:</p><pre> </pre><ol> <li><?xml version="1.0" encoding="utf-8" ?> </li> <li><configuration> </li> <li>  <runtime> </li> <li>    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> </li> <li>      <probing privatePath="MyAllLibraries" /> </li> <li>    </assemblyBinding> </li> <li>  </runtime> </li> <li></configuration> </li></ol><p>特别好理解,就是指明程序如果没有找到这个dll文件,那么我去哪里寻找。。。这样,我们就能顺利运行了。不截图了。</p><p>(3)使用VS IDE 进行配置</p><p></p><p>我们能新建Application Configuration File,然后进行配置。这个时候,它会自动把更新的内容更新到相应的 程序名.exe.config中。。</p><p>3.2共享程序集</p><p> (1)了解共享程序集</p><p>上一节中,我们梳理了下私有程序集,现在我们说下共享程序集。那么它们之间最大的区别是什么呢?它们的本质区别是共享程序集的一个副本可供一台机器上的多个应用程序使用。</p><p>比 如,我现在新建一个 Windows Forms的程序,里面有一个“MessageBox.Show()”方法,可是很遗憾,你没法再你新创建的应用程序下面找 到:System.Windows.Forms.dll的引用,为啥?因为它是共享的程序集。不信 你看下图,我没骗你把。</p><p></p><p>那么共享文件部署到哪里呢?它安装在GAC(Globle Assemble Cache)中,这个GAC  在下面的目录中。</p><p></p></div>

- 阅读剩余部分 -

20分钟读懂程序集(1)

<div><p>一.程序集是什么</p><p>程序集,说白了就是一个 .dll 或者 .exe为后缀的文件。当然,如楼下朋友所说,是基于.NET平台的!~。谢谢。</p><p>程序集,包括以下部分:</p><ul> <li>Windows 文件首部</li> <li>CLR 文件首部</li> <li>元数据</li> <li>程序集清单</li> <li>可选的内嵌资源 <div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div> </li></ul><p>Windows文件首部(知道有这么一个东西就行):就是告诉windows操作系统,本应用程序是ASP.NET 还是Winform还是控制台应用程序。那怎么查文件首部信息呢?</p><blockquote><p>打开VS的命令行工具 然后输入</p><p>dumpbin/headers 项目名称</p></blockquote><div></div><p>程序集分为2类,私有程序集和共享程序集。</p><p>CLR 首部信息:运行于.NET 的程序都是需要这个标志哦!~如果需要查看它,也很简单,</p><blockquote><p>打开VS的命令行工具 然后输入</p><p>dumpbin/clrheaders 项目名称</p></blockquote><p>元数据:元素就是.NET 编译后的语言,我们可以打开ILDASM.exe 工具进行查看,然后再按Ctrl +M 打开元数据查看:</p><p></p><p>程序集清单:就是记录这个程序包含了哪些dll程序以及这个版本是啥等等。。。</p><p>二.单文件程序集和多文件程序集</p><p>2.1单文件程序集</p><p>我们大多数的情况用的都是单文件程序集哦!。这个特别好理解,比如我们新建一个类库工程,然后进行编译,一般来说,编译之后我们会得到一个 *.dll的文件,ok,这个就是单文件程序集啦!~</p><p>2.1多文件程序集</p><p>好,我们来说说多文件程序集。我们得知道,程序集由什么构成?是模块。所以,多文件程序集就是有多个模块构成的程序集。很遗憾的是,如果我们需要构建多文件程序集,VS IDE 是没法做的,只能通过命令行的csc.exe 命令进行。真辛苦~~~。</p><p>(1)在记事本里 写一段简单的code,如下:</p><pre> </pre><ol> <li>using System;  </li> <li> </li> <li>namespace Person  </li> <li>{  </li> <li>  public class China  </li> <li>  {  </li> <li>    public void DisplayChinese()  </li> <li>    {  </li> <li>      Console.WriteLine("I'm Chinese");  </li> <li>    }  </li> <li>  }  </li> <li>} </li></ol><p>然后,打开你VS 命令行,把上面的生成一个模块,命令如下:</p><blockquote><p>csc.exe /t:module China.cs</p></blockquote><p>我们能看到生成了一个:China.netmodule的模块文件。</p><p>(2),接着我们在新建一个文件,并且这个文件生成是dll文件。</p><pre> </pre><ol> <li>using System;  </li> <li> </li> <li>namespace Person  </li> <li>{  </li> <li>  public class Japan  </li> <li>  {  </li> <li>    public void DisplayJapanese()  </li> <li>    {  </li> <li>      Console.WriteLine("I'm Japanese");  </li> <li>    }  </li> <li>  }  </li> <li>} </li></ol><p>(3)把刚China.netmodule模块加入到刚需要生成的dll文件中。</p><p>命令是:</p><blockquote><p>csc.exe /t:library /out:Lanny.dll Japan.cs /addmodule:China.netmodule</p></blockquote><p>我们能看到生成了一个Lanny.dll的文件。。我们可以把这个文件引入到程序中进行测试。Ok,我们一个多文件程序集就这样程序。但是,我感觉这样的用处不大。</p><pre> </pre><ol> <li>Japan j = new Japan();  </li> <li>      j.DisplayJapanese();  </li> <li>      Console.ReadKey(); </li></ol><p>能弹出“I'm Japanese”,说明我们引用成功了。</p></div>

- 阅读剩余部分 -

Visual Studio 2010层架构验证的实现

<p>我们将使用一段非常简单的代码,主要强调的是代码所代表的概念,而不是代码的细节。并将在现有代码层关系架构逻辑设计分析的基础上进行层验证(Layer Validation)功能:</p><p>① 打开Visual Studio 2010,通过Modeling Projects模板指定解决方案(Solution)的名称为LayerValidation(File|New|Project命令,选择 ModelingProject,命名为LayerValidation),并提供创建一个名为“Client”的C#控制台程序,单击“OK”按钮。</p><p>②在解决方案浏览器中,使用鼠标右键单击Solution节点,选择“New Project…”命令,在弹出的对话框中选择“Class Library”并将工程命名为“Implementation”。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>③ 重复以上几步,创建名为“Interfaces”和“Creators”的Class Library工程。展开Interfaces工程节点,用鼠标右键单击Class1.cs,选择“Rename”命令,将该文件重命名为 “IDataRetriever.cs”,并在弹出的对话框中选择“Yes”。文档编辑窗口和Solution Explorer如图5所示。</p><p> 文档编辑窗口和Solution Explorer  文档编辑窗口和Solution Explorer</p><p>图5  文档编辑窗口和Solution Explorer</p><p>④ 把class的关键字改为interface,将IDataRetriever变成一个接口。为IDataRetriever添加一个get属 性,该属性返回一个IData类型的对象。在IData下面有红色波浪线,表示IData不存在。Visual Studio 2010的新功能可以自动解决这个问题:用鼠标右键单击出错的IData,选择“Generate”命令,然后选择“Other…”命令,将看到一个 “New Type”对话框。将其中的“Access:”修改为“public”,将“Kind:”修改为“interface”,其他的保留默认设置,单击 “OK”按钮。VS会自动向Interfaces工程添加一个IData.cs文件,并在文件中创建一个名为IData的接口。</p><p>⑤展开Implementation工程节点,用鼠标右键单击References节点,选择“Add Reference…”命令,在弹出的对话框中选择Projects页,然后选择Interfaces工程,单击“OK”按钮。</p><p>⑥ 将Class1.cs重命名为DataRetriever.cs。打开DataRetriever.cs文件,修改DataRetriever类 使其实现IDataRetriever接口。当输入IDataRetriever的时候没有出现智能输入支持,可以手动输入 IDataRetriever,然后会发现IDataRetriever下面又出现了红色波浪线。将鼠标移动到IDataRetriever上,会注意到 在这个单词开始的位置下方有一个方形的小图标。单击它并选择“using Interfaces;”命令,它会自动为你添加所需的using语句,如图6所示。 </p><p>自动化提示添加代码语句</p><p>图6  自动化提示添加代码语句(名字空间)</p><p>现 在“using Interfaces”已经自动添加好了。再次选中这个图标,不过这次选择“Implement interface ‘IDataRetriever’”命令,可自动生成“DataRetriever”代码文件。如上所示,创建了一个对象,调用了对象的一个属性,然后抛 出一个“NotImplementedException”异常,程序描述了一个实际系统中经常遇到的问题。</p><p>⑧接下来向Client工程中添加到Implementation和Interfaces工程的引用。打开Client工程中的Program.cs文件,参考代码如下:</p><pre> </pre><ol> <li>using System;  </li> <li>using System.Collections.Generic;  </li> <li>using System.Linq;  </li> <li>using System.Text;  </li> <li>using Implementation;  </li> <li>using Interfaces;  </li> <li> </li> <li>namespace Client  </li> <li>{  </li> <li>class Program  </li> <li>    {  </li> <li>static void Main(string[] args)  </li> <li>        {  </li> <li>DataRetriever dr = new DataRetriever();  </li> <li>IData data = dr.Data;  </li> <li>        }  </li> <li>    }  </li> <li>} </li></ol><p>在 这段代码中,Client工程直接访问了一个接口(IDataRetriever)的实例(DataRetriever)。在没有需求功能扩展前 没有太大问题,因为所有的数据是从DataRetriever中获取(可以想象DataRetriever是从SQL数据库中获取的数据)。如果将来需要 从另一种数据源中获取数据,在不改动应用程序其他部分的情况下实现需求,可以使用Layer Diagram和Layer Validation来保证开发代码不会违反这一设计。</p><p>我们可以不对接口的具体实现做任何设置,而仅仅依赖于接口本身。这是一个相当普遍的设计模式,但是在现实应用中很容易被违反。只要一行错误的代码就会破坏这个模式,从而在建立模块间出现了不必要的依赖关系(通常使用控制反转(IoC)来解决这个问题)。</p><p>⑨ 创建Layer Diagram。可以创建一个Layer Diagram来可视化地描述在架构中想要维护的约束关系。单击主菜单的Architecture|New Diagram命令,选择“Layer Diagram”命令,并将层图命名为“FirstLayerDiagram.layerdiagram”,在弹出的对话框中,将工程命名为 “FirstModelingProject”。</p><p>⑩塑模范本,将代码映射到层上。在Layer Diagram Designer中,从工具箱中拖曳出三个Layer工具到设计平面上,分别由上至下指定层的名称为Client、Interface、 Implementation,代表应用程序、工作接口和方法。表示的是Client Logic层依赖于Interfaces层,Implementation层同样依赖于Interfaces层。但是Client Logic层和Implementation层之间没有依赖关系,如图7所示。</p><p>创建映射</p><p>图7  创建映射</p><p>如 上图所示,然后建立各个层次之间的相互关系。从工具箱中选择Dependency工具,在Solution Explorer中,选中Client工程并将它拖曳到Layer Diagram上的Client Logic层上,代表Client层会依赖Interface层。这时出现了一个由Client指向Interface的箭头链接。将 Interfaces工程拖到Interfaces层上;最后,将Implementation工程拖到Implementation层上,代表 Implementation层会依赖Interface层;在层右上角的数字“1”表示该层已经和一个工程相关联。</p><p>如果选中Client Logic、Interfaces和Implementation层,再打开Layer Explorer,就可以看到和当前层关联的项目,这里是Client.exe、Interfaces.dll和Implementation.dll, 然后就可以用这张图来对代码进行约束与验证,如图8所示。 </p><p>进行架构验证</p><p>图8  进行架构验证</p><p>如上图所示,进行架构验证。用鼠标右键单击Layer Diagram的任何位置,选择“Validate Architecture”命令,进行验证。</p><p>验证架构(Validate Architecture):可以检查出我们的程序是否破坏了层次图中的依赖关系,如果我们的程序中的CaryLayer项目中的程序调用了Common项目中的类等于就违反了以前设计好的层次图,在验证架构的时候就会失败。</p><p>依赖关系(Generate Dependencies):可以根据我们程序中的调用关系生成层的依赖关系。</p><p>错 误列表。命令执行完成后会看到“Error List”窗口中有三条错误信息,同时指示错误发生的区域。检视一下错误内容,会发现我们要求的层次依赖关系被破坏了。这是因为Client工程中的 Program.cs直接使用了Implementation工程中定义的类型。而在刚才创建的图中,这种依赖关系是错误的,如图3错误列表提示。</p><p>修正代码,解决错误问题。</p><p>打开Program.cs文件,需要确保只使用Interfaces工程中定义的类型,而不能直接使用Implementation工程中定义的类型。我们需要在不产生直接依赖关系的情况下创建实现IDataRetriever接口的对象。</p><p>解 决方法是使用Factory模式,利用Factory建立以接口为主的方法。当以后要传回的信息接收器是针对不同的信息来源进行处理的,只要调整 Factory方法传回对应的接收器即可,原本的应用程序不用改动,因为它都是通过接口决定作业的,只要实做了同样接口的类都可以套用,从而增加了程序的 弹性和维护能力。使用工厂(Factory)模式来解决这个问题的步骤如下:</p><p>在Solution Explorer中展开Creators工程,将Class1.cs重命名为TypeCreator.cs。</p><p>向Creators工程中添加对Implementation和“Interfaces”工程的引用(Creators工程现在依赖于Implementation和Interfaces工程)。</p><p>打开TypeCreators.cs,向其中添加一个静态方法,该方法返回一个IDataRetriever的对象。</p><p>代码参考如下所示:</p><pre> </pre><ol> <li>using System;  </li> <li>using System.Collections.Generic;  </li> <li>using System.Linq;  </li> <li>using System.Text;  </li> <li>using Implementation;  </li> <li>using Interfaces;  </li> <li> </li> <li>namespace Creators  </li> <li>{  </li> <li>public class TypeCreator  </li> <li>    {  </li> <li>public static IDataRetriever CreateDataRetriever()  </li> <li>        {  </li> <li>return new DataRetriever();  </li> <li>        }  </li> <li>    }  </li> <li>} </li></ol><p>在Client工程中,移除对Implementation工程的引用,添加对Creators工程的引用。</p><p>修改Program.cs,使用刚才新加的方法来创建对象。代码参考如下所示:</p><pre> </pre><ol> <li>using System;  </li> <li>using System.Collections.Generic;  </li> <li>using System.Linq;  </li> <li>using System.Text;  </li> <li>using Interfaces;  </li> <li>using Creators;  </li> <li> </li> <li>namespace Client  </li> <li>{  </li> <li>class Program  </li> <li>    {  </li> <li>static void Main(string[] args)  </li> <li>        {  </li> <li>IDataRetriever dr = new TypeCreator.CreateDataRetriever();  </li> <li>IData data = dr.Data;  </li> <li>        }  </li> <li>    }  </li> <li>} </li></ol><p>修正代码,解决错误问题。</p><p>重 新编译Solution,并重新打开FirstLayerDiagram,用鼠标右键单击,在菜单中执行“Validate Architecture”命令。这样我们就不是直接通过实做的类进行信息的存取,而是经由Factory取得符合接口定义的内容。再做一次层验证,我们 会看到所有的错误都消失了。</p><p>总结: 通过使用Visual Studio 2010层关系设计架构,我们就可以在开始阶段通过层关系图来进行逻辑设计,并努力执行设计方案,保证开发阶段与设计不偏离,通过自动化(例如门控签入) 进行强制执行,使团队人员的代码不漂移出架构,从而避免“漂移”发生。另外,采用Layer Diagram来验证代码架构的方法,大型项目也可以通过相同的方式进行验证。这包括如何将代码映射到层上,以及如何通过手动的方式来验证代码是否遵守定 义的约束关系,也可以在编译代码的过程中自动地进行验证。</p></div>

- 阅读剩余部分 -

VS的那些快捷键..

<p>Visual Studio 的常用快捷键 ..整理下 ....不知道为什么VS一定要沿用这样的2次操作的快捷键..但是用的次数多了..慢慢的也就能忍了 ....</p><p>Shift+Alt+Enter: 切换全屏编辑

Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签

Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>

Ctrl+Shift+V: 剪贴板循环

Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本

Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写

代码快捷键

Ctrl+J / Ctrl+K,L: 列出成员
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息

Ctrl+E,C / Ctrl+K,C: 注释选定内容
Ctrl+E,U / Ctrl+K,U: 取消选定注释内容

Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码

F12: 转到所调用过程或变量的定义

窗口快捷键

Ctrl+W,W: 浏览器窗口
Ctrl+W,S: 解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
Ctrl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲

Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口

Ctrl+Tab: 活动窗体切换

Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项
Shift+Alt+Enter: 切换全屏编辑

Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签

Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)

Ctrl+Shift+V: 剪贴板循环

Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本

Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写

代码快捷键

Ctrl+J / Ctrl+K,L: 列出成员
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息

Ctrl+E,C / Ctrl+K,C: 注释选定内容
Ctrl+E,U / Ctrl+K,U: 取消选定注释内容

Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码

F12: 转到所调用过程或变量的定义

窗口快捷键

Ctrl+W,W: 浏览器窗口
Ctrl+W,S: 解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
Ctrl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲

Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口

Ctrl+Tab: 活动窗体切换

Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项</p>

- 阅读剩余部分 -

生产数据库中,大批数据更新时应分批执行

<div><div><div>实际生产中,可能由于需求的变化需要对数据库中的数据做统一的更新。这时由于项目已经上线好久时间,数据库中的数据也已经很多了。这时的更新操作如果一次执行,可能对数据库造成数据阻塞,给用户的浏览造成问题。比较好的做法是每更新一批数据后,就停顿一定的时间。<div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><div align="left">         public void ProcessRequest(HttpContext context)</div><div align="left">        {</div><div align="left">            context.Response.ContentType = "text/html";</div><div align="left"> </div><div align="left">            Entities db = new Entities();</div><div align="left"> </div><div align="left">            int page = 1;</div><div align="left"> </div><div align="left">            while (true )</div><div align="left">            {</div><div align="left">                int take = page 1000;</div><div align="left">                int skip = (page - 1) 1000;</div><div align="left">                var links = db.XXX.OrderBy(p=>p.ContentID).Take(take).Skip(skip).Select(p => new { p.ContentID, p.DownIDs }).ToList();</div><div align="left"> </div><div align="left">                if (links.Count() == 0)</div><div align="left">                {</div><div align="left">                    break;</div><div align="left">                }</div><div align="left"> </div><div align="left">               </div><div align="left">                for (int i = 0; i < links.Count; i++)</div><div align="left">                {</div><div align="left">                    string[] downIDs = new string[] { };</div><div align="left">                    if (string .IsNullOrEmpty(links[i].DownIDs))</div><div align="left">                    {</div><div align="left">                        continue;</div><div align="left">                    }</div><div align="left"> </div><div align="left">                    downIDs = links[i].DownIDs.Split( ',');</div><div align="left"> </div><div align="left"> </div><div align="left">                    for (int j = 0; j < downIDs.Length; j++)</div><div align="left">                    {</div><div align="left">                        int contentId = links[i].ContentID;</div><div align="left">                        int downId = Convert .ToInt32(downIDs[j]);</div><div align="left">                        var query = db.YYY.FirstOrDefault(p => p.ContentID == contentId && p.DownID == downId);</div><div align="left">                        if (query == null )</div><div align="left">                        {</div><div align="left">                            db.YYY.Add( new Y{ ContentID = contentId, DownID = downId, DateAdded = DateTime .Now });</div><div align="left"> </div><div align="left">                        }</div><div align="left">                    }</div><div align="left"> </div><div align="left">                }</div><div align="left">                db.SaveChanges();</div><div align="left">                context.Response.Write( "<br>");</div><div align="left">                context.Response.Write(links.Count());</div><div align="left">                context.Response.Flush();</div><div align="left">                page++;</div><div align="left">                System.Threading. Thread.Sleep(100);</div><div align="left">            }</div></div></div></div>

- 阅读剩余部分 -

asp.net mvc中使用Dropdownlist

<div><p>例1:如果在Action方法中有如下代码:</p><p>List<SelectListItem> items = new List<SelectListItem>(); items.Add(new SelectListItem { Text = "Kirin", Value = "29" });
items.Add(new SelectListItem { Text = "Jade", Value = "28", Selected = true});
items.Add(new SelectListItem { Text = "Yao", Value = "24"});
ViewData["list"] = items;</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>在View中这样使用:<%=Html.DropDownList("list")%> </p><p>例2:如果Action中代码如下:</p><pre>List<SelectListItem> items = new List<SelectListItem>(); items.Add(new SelectListItem { Text = "Kirin", Value = "29" }); items.Add(new SelectListItem { Text = "Jade", Value = "28"}); items.Add(new SelectListItem { Text = "Yao", Value = "24"}); this.ViewData["list"] = items; this.ViewData["selected"] = 24;</pre><p>View中的代码如下:</p><pre><%=Html.DropDownList("selected", ViewData["list"] as IEnumerable<SelectListItem>)%></pre><pre> </pre><p>那么辅助方法将ViewData["list"]绑定为下拉框,然后从ViewData中获取key为selected的项,并将下list中Value值与该项的值相等的SelecteListItem设为默认选中项。</p><p>以上两种方法尽管可以实现DropDownList的正确显示,但并非最佳实践。</p><p> </p><p>最佳方法:</p><p>ASP.NET MVC为DropDownList和ListBox(都在html中使用select标记)准备了一个辅助类型:SelectList。SelectList继承自MultiSelectList,而后者实现了IEnumerable<SelectListItem>。也就是说,SelectList可以直接作为Html.DropDownList方法的第二个参数。</p><p>MultiSelectList包含四个属性,分别为:</p><ul> <li>Items:用于在select标记中出现的列表,通常使用option标记表示。IEnumerable类型。</li> <li>DataTextField:作为option的text项,string类型。</li> <li>DataValueField:作为option的value项,string类型。</li> <li>SelectedValues:选中项的value值,IEnumerable类型。</li></ul><p>显然,作为DropDownList来说,选中项不可能为IEnumerable,因此SelectList提供了一个新的属性:</p><ul> <li>SelectedValue:选中项的value值,object类型。</li></ul><p>同时,SelectList的构造函数如下所示:</p><pre>public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue) : base(items, dataValueField, dataTextField, ToEnumerable(selectedValue)) { SelectedValue = selectedValue; }</pre><p>于是我们的代码变为:</p><pre>var users = GetUsers(); var selectList = new SelectList(users, "Age", "Name", "24"); this.ViewData["list"] = selectList;</pre><pre><%=Html.DropDownList("list")%></pre><pre>这才是MVC最佳方案</pre></div>

- 阅读剩余部分 -

WCF事务

<div><p>事务是并发控制的基本单位.是一个操作序列,这些操作要么执行,要么都不执行,它是不可分割的单元</p><p>WCF事务模式</p><p>None:不启用事务  </p><p>Client 客户端启用,强制服务参与</p><p>Service 服务启用</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>Client/Service:客户端或服务本身启用事务</p><p>WCF事务模式配置</p><p>Client/Service 最常见的一种事务模型,通常由客户端或服务本身启用一个事务,步骤:</p><p>1.选择一个支持事务的Binding 设置TransactionFlow=true</p><p>2.设置TransactionFlow(TransactionFlowOption.Allowed)</p><p>3.操作上启用事务,设置OperationBehavior(TransactionScopeRequired=true)</p><p>Client 客户端强制启用事务,强制服务必须参与事务,步骤:</p><p>1.选择一个支持事务的Binding 设置TransactionFlow=true</p><p>2.设置TransactionFlow(TransactionFlowOption.Mandatory)</p><p>3.操作上启用事务,设置OperationBehavior(TransactionScopeRequired=true)</p><p>Service事务 服务必须启用一个根事务,而且不参与任何外部事务,设置步骤:</p><p>1.选择任何一种Binding,设置TransactionFlow=false</p><p>2.设置TransactionFlow(TransactionFlowOption.NotAllowed)</p><p>3.操作上启用事务,设置OperationBehavior(TransactionScopeRequired=true)</p><p>WCF事务管理协议</p><p>WCF事务传播</p><p>//使用事务域</p><p>using(TransactionScope ts=new TransactionScope())</p><p>{</p><p>     //这里所有代码都会做为一个事务去执行</p><p>     Console.WriteLine("调一下服务");    </p><p>     .....</p><p>     ts.Complete(); //如果正常,通知事务管理器提交事务</p><p>}</p></div>

- 阅读剩余部分 -

随机文章

最近回复

分类

其它

友情连接

推广链接