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.總結
本隨筆記錄了我的一些認識,關於依賴注入框架很多東西公司都是封裝好的,還要繼續深入的學習,最后還是求指教~~