DotNet编程规范(草)part4

来源:互联网 发布:迅雷php文件怎么打开 编辑:程序博客网 时间:2024/04/29 10:24
7框架特别说明
7.1 数据访问
1.         使用类型安全的数据集合数据表,尽量不要使用未经封装的ADO.NET。
2.         使用事务访问数据库。
3.         使用Enterprise Service或System.Transection
4.         不要显示的通过数据库,使用ADO的事务。
5.         设置事务的隔离级别为序列。
6.         不要通过资源管理器拖拽方式在界面上添加数据源,这样会让表现层和数据层造成紧耦合。
7.         使用Windows集成验证代替,SQL Server验证。
8.         以不同的身份运行访问SQL Server的组件和客户端。
9.         将存储过程封装在高层类型安全的类中。只有这些类可以调用存储过程。尽量使用类型安全的vs2005的数据适配器。
10.     避免把业务逻辑放到存储过程中。(这点有待商榷)
7.2 ASP.NET 和 Web Service
1.         不要把代码放到aspx文件中,所有的逻辑都应在单独文件中,使用局部类编辑。
2.         局部类中应该调用组件形式访问,而不是在直接把业务逻辑包含进来。
3.         在使用session变量前一定要检查非空。
4.         在交互页面或Web服务,一定要把session放到SQL Server。
5.         设置服务器端控件的Auto-PostBack属性为false。
6.         为 ASP.NET页面开启智能导航。
7.         为Web服务提供接口。
8.         为Web服务提供命名空间和服务描述。
9.         为Web方法提供描述。
10.     为添加的Web引用起一个有意义的本地名称。
11.     通过本地属性访问session变量。
12.     总是让客户端的web服务包装类支持cookies,因为我们无法判断web服务是否需要访问session。
13.     在退出页面时,必须在Page_Disposed(sender,e)事件中释放掉会驻留在内存的变量,主要是Session变量、DataSet变量。
14.     TextBox 控件的Enabled属性为False时,其背景颜色必须设为灰色(颜色名称: Silver)。
15.     切换当前的控件,除了本身默认的Tab键外,再加上Enter键。
16.     通用变量:采用session赋值,统一放在Global.asax中的Session_Start(sender,e)过程中,初始值赋予空字符串。并在Session_End(sender,e)过程中释放掉。
17.     JavaScript 编码:命名/排版参考此文档。
7.3 多线程
1.         使用同步域,避免使用容易造成死锁的手动同步操作。
2.         不要在同步域外进行调用。
3.         在回调函数中管理异步调用。
4.         给线程命名,可以调高调试的效率。Thread myThread ; myThread.Name = “MYThread”;
5.         不要在线程中调用suspend 和resume方法。
6.         不要轻易使用sleep方法,除非:使用sleep(0)强制进行切换;调试代码时调用sleep。
7.         不要调用SpinWait方法。
8.         使用同步对象代替Thread.Abort调用。
9.         除非任务的需要,不要设置线程的优先级。
10.     不要读取ThreadState属性,应该通过Thread.IsActive来判断线程是否dead。
11.     不要通过设置线程的属性为后台线程来关闭应用,应该使用WatchDog等监控对象来关闭线程。
12.     除非线程的关联关系得到保证,否则不要使用本地的存储机制。
13.     不要调用Thread.MemoryBarrier方法。
14.     调用Thread.Join方法之前一定要使用断言检查要添加的线程。
15.     使用Lock() 操作代替显示的进行监控操作。
16.     把lock方法封装到他保护的对象中。
17.     可以使用同步方法代替自己调用lock。
18.     禁止使用Mornitor挂起或暂停一个对象,应该使用手动或自动的reset事件。
19.     避免访问volatile变量,应该先lock要访问的对象或字段以保证访问安全,禁止使用
20.     Thread.VolatileRead等Volatile操作。
21.     不要更改线程池中的最大线程书目。
22.     不要一次使用多个lock语句,因为这无法实现原子锁定操作。应该使用WaiteAll方法。
7.4 序列化(参考)
1.         优先使用二进制格式。
2.         设置序列化事件处理函数为私有方法。
3.         使用泛型接口IGenericFormatter。
4.         将非密封类标识为serializable。
5.         在一个非密封类中实现IDeserializationCallback,保证在子类中可以调用OnDeserialization。
6.         将非序列化变量标识为非序列化。
7.         一个可序列化的类中的委托要标识为非序列化的。
7.5 Remoting (参考)
1.         优先使用管理配置,其次考虑(不明白)
2.         为调用对象实现IDisposable接口。
3.         除非防火墙的问题,否则优先考虑使用二进制格式的TCP通信。
4.         为单件模式对象提供null返回值。(不明白)
5.         为客户对象提供一个发起者,他应该返回初始(不明白)
6.         当应用程序关闭时,撤销客户对象的发起者。(不明白)
7.         将远程对象放到类库中。
8.         避免使用SoapStub。
9.         避免在IIS中进行操作(不明白)
10.     避免使用单向通道。
11.     在Main函数中加载远程配置,即使配置文件为空。
Static void Main()
{
   RemotingConfiguration.config(“MYMain.exe.confg”);
}
12.     在客户端注册port()以便于回调
13.     在客户端和服务器端设置全类型过滤,以便实现回调。
7.6 安全(参考)
1.         给程序集和组件强命名。
public class PublicKeys
{
public const string commpanyName = “123456789”+
“erqwrqwrqewrqwrq”+
“!@#$%^^&&**((”;
        [StrongNameIdentityPermision(Security.Action.LindDemand,publickey = PublicKeys.commpanyName)]
}
2.         给应用程序的配置文件提供加密盒安全保护。
3.         通过DllImport导入一个交互方法时,检查并设置合适的安全许可。
[DllImport(“user32”,EntyPoint=”MessageBoxA”)]
private static exten int Show(IntPtr ,string text,string caption, int msgType);
[SecurityPermission(SecurityAction.Assert,UnmanagedCode=true)]
[UIPermission(SecurityActio.demand,Window=UIPermission.SaveTopLevelWindows)]
4.         不要通过SuppressUnmagagedCodeSecurity属性来禁用非托管代码。
5.         不要使用TlbImp.exe的/unsafe开关,在托管代码中包装RCW以便可以断言和设定许可。
6.         在服务器上部署代码访问安全策略(只给Microsoft,ECMA和自己完全信任),其他位置的代码默认没有任何访问权限。
7.         客户机的安全策略:只能执行,回调服务器方法,显示用户界面。如果没有应用clickonce(一次部署),在代码中使用强命名标识客户程序。
8.         为了抵御攻击,在程序集级别拒绝所有的没有申请的任务执行。
[Assembly:UIPermision(SecurityAction.Requestrefuse, window=UIPermissionWindows.AllWindows)
9.         在Main函数中设值主要策略为窗口类型。
static void Main()
{
AppDomain currentDomain = Thread.GetDomain();
currentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
}
 
7.7 System.Trancactions
1.         对TrancactionScope对象要记得调用它的dispose方法。
2.         事务范围内不要再complete调用后不要写任何代码。
3.         在设置环境事务时,记得要保存老的事务,并在最后进行恢复。
4.         在发布版本中,不要把事务的超时时间设置为0。
5.         克隆复制一个事务时,使用:DependentCloneOption.BlockCommitUntilCoplete.
6.         不要传递一个事务的克隆拷贝给TrancactionScop对象的构造函数。
7.         捕获并分发被设置为TrancactionScope.Option.Suppress 的TrancactionScop抛出的异常。
7.8企业服务(参考)
1.         在事务性方法中是用AutoComplete属性,不要抛出异常。
2.         使用AutoComplete属性而不要随便调用SetComplete(),SetAbort()之类的方法。
[Transaction]
public class MyComponent: ServicedComponent
{
[AutoComplete]
public void MyMethod()
{
}
}
3.         重载ServicedComponent类的CanBePool方法,并返回true。
4.         除非组件被配置为JIAT,否则要对放到池里的对象显示的调用Dispose方法。
5.         如果组件被配置为JIAT,则禁止调用它的Dispose方法。
6.         设置应用程序和组件的认证级别为私有。
7.         设置所有的应用程序的认证级别为私有。
[assembly:ApplicationActivition(ActivitionOption.Server)]
[assembley: ApplicationAccessControl(true,
                AccessCheckLevel=AccessCheckLevelOption.ApplicationComponent,
                Authentication = AuthenticationOption.Privacy,
                ImpersonationLevel=ImpersonationLevelOption.Indentify
)]
8.         设置客户程序集的Impersonal Level为Indentity
9.         服务组件的AccessControl为true。(默认是false)
10.     为每个用户赋予Marshaler角色。
11.     [assembly:SecurityRole(“Marshaler”,SetEveryOneAccess=true)]
12.     为每个需要认证的类设置SecurityMethod属性
[SecurityMethod]
public class MyClass: ServicedComponent
{}
 
 
原创粉丝点击