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
{}
- DotNet编程规范(草)part4
- DotNet编程规范(草)part4
- DotNet编程规范(草)part1
- DotNet编程规范(草)part2
- DotNet编程规范(草)part3
- DotNet编程规范(草)part2
- DotNet编程规范(草)part3
- DotNet编程规范1.0(Draft)
- dotnet 程序设计(规范)会议记录
- CommonJS规范 part4
- Part4:算法(一)
- Part4:算法(二)
- Part4:算法(三)
- part4
- DotNet项目组编码规范
- DotNet项目组编码规范
- DotNET异步编程
- dotnet 网络编程 tcp
- Using Visual Studio to Debug JavaScript in IE
- 在 Hibernate 中使用 oracle 的 sequence 产生主键实现 SQL Server 自增长字段功能
- 将字符串转换为相应数值
- Net下几种日志管理方法
- Exception in thread "main" java.lang.NoClassDefFoundError:
- DotNet编程规范(草)part4
- mouse_event
- Semantic Web
- 服务器端控件怎样使用一键快捷方式
- 10月15日的作业(无线路由器)
- The Road to the Semantic Web
- 0xE06D7363: Microsoft C++ Exception.
- 打造您的 Eclipse RCP 产品
- 基于IMS架构的业务应用