zoukankan      html  css  js  c++  java
  • 从写死到写活

    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.总结

    本随笔记录了我的一些认识,关于依赖注入框架很多东西公司都是封装好的,还要继续深入的学习,最后还是求指教~~

  • 相关阅读:
    WinCE下SQLCE数据库开发(VS,VB.net,VC++)
    基于VC++的WinCE网口通信
    WinCE下的串口通信开发(VS2005,VB.Net,VC++)
    多线程CSerialPort类的多串口通信实现
    双T滤波电路用于PWM方式DAC的分析
    AD9516锁相环功能外接环路滤波器的设计与分析
    块结构中断有序化处理方法(一种单片机单线程方式下处理多中断的方法)
    STM32F10X固件库函数——串口清状态位函数分析
    STM32和STR71X移植uCos-II操作系统比较分析
    基于uIP和uC/OS-II嵌入式网络开发
  • 原文地址:https://www.cnblogs.com/hezhihao/p/4520347.html
Copyright © 2011-2022 走看看