一直觉得DBConnection的CreateDBCommand方法挺神秘的

[ 2313 查看 / 7 回复 ]

.NET Framework Class Library
DbConnection Members

CreateCommand        Creates and returns a DbCommand object associated with the current connection.
Protected methodSupported by the XNA Framework       

CreateDbCommand        Creates and returns a DbCommand object associated with the current connection.

我在用四大核心对象的时候,Command是可以自己new,也可以让Connection去CreateCommand..
TOP

那么,具体到SqlConnection是怎么去CreateCommand的呢?终于有机会去反编译看了一眼。。 [code]public SqlCommand CreateCommand() {     return new SqlCommand(null, this); } [/code]
TOP

就是这么简单。。SqlCommand这个类提供了一个构造器重载(显然,我们自己也有时候会使用这个重载)。。 有些提供了 数据库驱动连接程序的厂家,就不一定重载了这个 构造器 。比如 MySql。。 [code]public MySqlCommand CreateCommand() {     MySqlCommand command = new MySqlCommand();     command.Connection = this;     return command; }[/code] MySqlCommand command = new MySqlCommand(){Connection = this}; 用C#3.0的语法又可以简写成上面这个样子。。
TOP

嗯,这里体现了:
抽象工厂模式,
创建者模式,
门面模式,
和类的职责分配设计原则.

你把这几点解释一下.
TOP

Abstract Factory:那个DBConnection DBCommand就是抽象的产品基类。而SqlConnection SqlCommand 和MysqlConnection MysqlCommand就是 具体产品。而Sql(代表Sql server),Mysql则分别是 两种产品系列。

Builder:一步一步创建一个复杂的对象,具体怎么创建的,用户其实并不知情。用户只需要提供 DBConnection,DBCommand这2大核心对象,然后调用DBCommand这个对象的Execute(具体可以有多种执行方式,可以ExecuteScalar,可以是ExecuteReader,也可以是ExecuteNonQuery)。

Command:说到执行的多种方式,又应该应用了 命令 模式。因为,每次查询动作,被包装成一个命令。我们本来是需要直接向数据库发命令(相当于直接找到厨师,叫他做菜),现在是向DBCommand这个抽象的命令对象中,发送消息(消息就是sql语句,也就是命令的具体内容,相当于点菜,要用到的菜单——现在不是直接命令厨师,而是把命令写在纸上,找服务员——这是一个间接层)。

这里想比较一下,.net的实现与Java的Jdbc的实现。.net的实现,我们通常使用具体的命令对象,SqlCommand,而jdbc的实现,一般是使用Statement和PreparedStatement两个接口。——当然,.net使用DBCommand抽象基类也是没问题的,几乎不算啥区别了。

有一点的区别是,jdbc的Statement和PreparedStatement两个接口的实现类,都必须是由 Connection对象创建,也就是说,你没办法去new一个具体的 命令对象 。而很显然,.net是可以 new SqlCommand(),然后把SqlConnection和CommandText等对象挂载到SqlCommand对象的属性上去的。

这样实现的结果,就是Jdbc的实现更简单,没有办法细致控制每个子类对象(没有继承就没有扩展)。当然,有时候可能可以省略这种扩展性(比如,不需要设置参数啊,执行存储过程啊这些复杂的功能,那我简单的用接口的方法,就已经足够)。引出下一个设计模式。

Facade:由于Java的Jdbc几乎都是基于接口的操作,因此它封装的更彻底。你只需要按照jdbc规定的流程去走完,对客户暴露的就是Connection,sql语句(就是命令模式中包装的消息),以及返回值。甚至连Command,用户都是摸不到的(因为是抽象的,没有 构造器 。。需要这样调用Connection.createStatement()得到)。而.net则更倾向于对用户开放些权限。比如,可以定制Command的属性,它可以是简单的sql,也可以是 存储过程的调用。(调用存储过程,就需要In/Out参数,子类需要扩展)。总而言之,言而总之,两者都是包装得非常好,用户接触到的东西都不多。(我们可以对比一下,如果直接用命令行访问数据库,是不是很麻烦,要一步步连接,再查询,再拿返回值)。
TOP

很好.
1.Builder模式这样理解也可以:通过Connection来构造它使用的Command.封转了构造的细节(尽管很简单).当然它对"构造复杂对象的局部"体现的不强,但不影响整体理解.
2.Command确实是典型的命令模式的体现,你补充了,很好.如果放在Connection来Create一个Command这样的讨论范围(上下文Context)中,Command的探讨,算是扩展阅读吧
TOP

老师你能否也把ado.net和asp.net的视频也上传到驴上啊?谢谢了,这些真是很重要啊。
TOP