从写死到写活
1.背景
本来菜鸟一枚,也是刚离开母校的学生,最近在接触依赖注入框架,看到它的好处之后,突然回忆起自己写代码的道路,虽然还走得不长,确实有自己的代码从写死到写活的体会,愿能帮助到有需要的人,也愿能博大牛一笑。
2.死代码
拿最熟悉的一个例子来说明吧,数据库连接访问。下面是执行SQL数据库操作的代码:
public void Insert(string sqlstr) { SqlConnection con = new SqlConnection("连接字符串"); con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandText = sqlstr; cmd.ExecuteNonQuery(); con.Dispose(); }
现在客户的要求变了,“我要换oracle数据库,oracle数据库比较高级!”,客户说道。那么以前的我会怎么做呢?答案是直接在函数(不止是这个函数,所有跟访问数据库的函数)上修改咯,看到sql就换成oracle咯
public void Insert(string sqlstr) { OracleConnection con = new OracleConnection("连接字符串"); con.Open(); OracleCommand cmd = con.CreateCommand(); cmd.CommandText = sqlstr; cmd.ExecuteNonQuery(); con.Dispose(); }
加班改好之后,客户又说“oracle用得不习惯,还是mssql好~”.......哭瞎,这下又要乖乖把全部代码修回去。
显而易见这种写法的缺点是有多严重,而且面向对象原则是少改代码啊,下面来看看改良版的。
3.半死半活代码
面向对象有个很重要的特性就是多态,一个基类的引用变量,可以指向多个不同的派生类对象,就叫多态。
有什么用呢?看看下面的代码。
public void add(string sqlstr) { IDbConnection con = new SqlConnection("连接字符串"); con.Open(); IDbCommand cmd = con.CreateCommand(); cmd.CommandText = sqlstr; cmd.ExecuteNonQuery(); con.Dispose(); }
因为SqlConnection实现了IDbConnection接口,而SqlCommand实现了IDbCommand接口,所以可以用这些接口来指向具体对象。
客户这时候用嚷嚷:“某某公司都用了oracle,我们怎么能输,我们还是得用!!”,这时候改代码就只需要把具体对象改成关于oracle的数据库操作对象即可,是不是比起上面那个工作量少了一半?好像还不止......
4.依赖注入
依赖注入是ioc模式的一种实现,大概意思是不要过度的高层代码不要过度依赖于低层代码,让低层代码实现接口,而高层代码直接依赖于接口即可,当业务再发生变化时,只需要修改接口与低层代码的映射就行。
IDbConnection con; public void add(string sqlstr) { con.ConnectionString = "连接字符串"; con.Open(); IDbCommand cmd = con.CreateCommand(); cmd.CommandText = sqlstr; cmd.ExecuteNonQuery(); con.Dispose(); }
然后要在一个文件上注册接口与实现类的关系
builder.Register<oracleConnection>().As<iDbConnection>();
注册之后相当于让iDbConnection接口指向了oracleConnection的实例对象
这样运行时就会执行对oracle数据库的操作。
这时候客户又说道:“什么?oracle数据库费用很高?那谁用啊,改回mssql吧~”这时候只需要改注册的关系即可。
5.总结
本随笔记录了我的一些认识,关于依赖注入框架很多东西公司都是封装好的,还要继续深入的学习,最后还是求指教~~