.Net 2005 partial class 的一种用途

   一般来说,我习惯把数据库操作部分和相应的类放在一起,比如,一个 BookCollection 类就应该自己包含操作 Book 表:

  1. using System;   
  2. using System.Collections;   
  3.   
  4. public class Book   
  5. {   
  6.     public string BookName;   
  7. }   
  8.   
  9. public class BookCollection : CollectionBase   
  10. {   
  11.     public void Add(Book b)   
  12.     {   
  13.         List.Add(b);   
  14.         SaveToDatabase(b);   
  15.     }   
  16.        
  17.     private void SaveToDatabase(Book b)   
  18.     {   
  19.         string sql = string.Format(   
  20.             "Insert Into [Books] ([BookName]) Values ('{0}')",   
  21.             b.BookName.Replace("'""''"));   
  22.         SqlConnection.CreateCommand(sql).ExecuteNonQuery();   
  23.     }   
  24. }  


  不过,对于三层结构的程序要求来说,应该把数据库操作部分和业务逻辑部分拆分开来:

  1. using System;   
  2. using System.Collections;   
  3.   
  4. public class Book   
  5. {   
  6.     public string BookName;   
  7. }   
  8.   
  9. public class BookCollection : CollectionBase   
  10. {   
  11.     public void Add(Book b)   
  12.     {   
  13.         List.Add(b);   
  14.         BookAccess.SaveToDatabase(b);   
  15.     }   
  16.        
  17. }   
  18.   
  19. public class BookAccess   
  20. {   
  21.     public static void SaveToDatabase(Book b)   
  22.     {   
  23.         string sql = string.Format(   
  24.             "Insert Into [Books] ([BookName]) Values ('{0}')",   
  25.             b.BookName.Replace("'""''"));   
  26.         SqlConnection.CreateCommand(sql).ExecuteNonQuery();   
  27.     }   
  28. }  


  这样做的话,既有优点,也有缺点。优点是,可以把所有的和数据库相关的操作分在同一组(比如另一个DLL中),也更容易查找和修改。而缺点是,必须把 SaveToDatabase 的访问操作符设置成 public,否则外部无法调用,无法指定由哪个类调用,而另一方面,以前的代码中的 SaveToDatabase 是 private 的,所以可以保证只有 BookCollection 才能调用 SaveToDatabase 函数,可以减少无谓的错误。

  但是,在 .Net 2005 中,可以使用 partial class 使之兼具这两种方法的优点:

  1. using System;   
  2. using System.Collections;   
  3.   
  4. public class Book   
  5. {   
  6.     public string BookName;   
  7. }   
  8.   
  9. public partial class BookCollection : CollectionBase   
  10. {   
  11.     public void Add(Book b)   
  12.     {   
  13.         List.Add(b);   
  14.         BookAccess.SaveToDatabase(b);   
  15.     }   
  16.        
  17. }   
  18.   
  19. public partial class BookCollection   
  20. {   
  21.     private void SaveToDatabase(Book b)   
  22.     {   
  23.         string sql = string.Format(   
  24.             "Insert Into [Books] ([BookName]) Values ('{0}')",   
  25.             b.BookName.Replace("'""''"));   
  26.         SqlConnection.CreateCommand(sql).ExecuteNonQuery();   
  27.     }   
  28. }  


  不过,以前我以为 partial class 也可以分布在不同的 Assembly 中,查了 C# 的在线帮助,是这样说的:

All partial-type definitions meant to be parts of the same type must be defined in the same assembly and the same module (.exe or .dll file). Partial definitions cannot span multiple modules.


  而,VB.Net 的帮助中关于 Partial Class 的说法是这样的:

However, all the declarations must be in the same assembly and the same namespace.



  所以,虽然我们可以把一个类用 partial 分成两个源文件,但是无法拆分到两个 dll 中,否则,对于这种数据访问层、业务逻辑层的拆分会更有利的。

  我之所以以前认为 partial class 可以分布在不同的 Assembly 中,原因在于在 .Net 2005 中的 web 开发也是使用的 partial class,而源程序文件和 aspx 文件应该会被编译到不同的 Assembly 中,所以,在发现 partial class 不能编译到不同的 Assembly 中后,又查看了一下 web 页,结果没有发现编译出的 dll 文件!难道 .Net 2005 的 asp.net 开发需要同时发布源程序文件的么?残念……

http://llf.hanzify.org/llf/show.asp?ID=342

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值