C 反射應用之實現動態可配置可擴充套件框架的簡單示例

2021-10-05 11:47:55 字數 2441 閱讀 7721

設想乙個場景:

我們做了乙個專案,最初,只支援mysql資料庫,所以我們一般直接在專案內部定義乙個類,並定義其方法

#mysqlhelper.cs

public class mysqlhelper

}

使用上,當然更簡單了

//專案最初,只支援mysql

mysqlhelper mysqlhelper = new mysqlhelper();

mysqlhelper.query();

隔了1個月,產品說版本公升級,支援一下sqlserver吧,然後,搞開發的同學,就開始想了,你這麼搞,難道我再加乙個類不成,也不是不行,就是太low了,不過既然都是和資料庫操作相關的類,乾脆我就寫個介面,定義資料庫操作相關方法,然後定義和資料庫相關的類來實現這個介面吧,畢竟也是要成為架構師的人嘛,怎能沒有這點小想法。

於是,猿a寫了乙個介面

#idbhelper.cs

public inte***ce idbhelper

接著,寫了2個類mysqlhelper和sqlserverhelper且都繼承該介面

#mysqlhelper.cs

public class mysqlhelper:idbhelper

}*****==

#sqlserverhelper.cs

public class sqlserverhelper : idbhelper

}

這樣,客戶是哪個資料庫,我就用哪種方式吧。

猿b看到了猿a的寫法,大叫一聲,「瞎搞」,然後開始了噴水.............

<?xml version="1.0" encoding="utf-8" ?>

我們就可以通過反射動態載入dll,然後實現動態可配置載入方式,到這裡,小心思又要來了,反射每次要寫那麼多**,如果每次呼叫都寫那麼多,那將dry原則置於何地呀,所以,就把它封裝成乙個簡單工廠吧,這樣就看起來完美了,

我們可以把上圖內容封裝到類******factory,**如下

public static class ******factory

}

這樣,操作就簡單了,我們只需在呼叫時,呼叫工廠類方法,建立物件,然後即可呼叫相應的query方法了

idbhelper dbhelper = ******factory.createinstance();

dbhelper.query();

看上去清爽多了,就跟直接new 類是一樣的。

那可能有小夥伴要說了,其實我沒必要用反射啊,我在配置檔案裡定義了要使用的資料庫型別,那我可以直接在工廠類裡將這個值作為引數傳入,然後根據這個值來生成相應的類啊,反正最後返回的都是idbhelper物件。是的,這樣的設計確實也沒問題,那麼,我們這裡為什麼要如此設計呢?這樣做有什麼好處呢?其實,是為了實現程式的可擴充套件,此話怎講呢?

再來想象一下這個場景,如果,我們現在又要支援oracle資料庫了,按照剛剛提到的這種方式的話,那我們就需要修改源程式,在******factory類裡新增對應的oracle物件的生成邏輯,使用時在修改配置檔案。

而如果是採用的上述方式的話,你發現沒,我們只需要將oracle物件對應的類庫檔案放到專案路徑下,然後通過修改配置檔案,即可完成程式的擴充套件,而基本無需改動源程式的任何**。那麼,你覺得哪種方式更優呢?

其實,說到這裡,我們能看出來,之前將mysqlhelper.cs和sqlserverhelper.cs放在專案框架下是不合理的,因為,作為單獨的資料庫操作類,我們應該將其設計成單獨類庫,這樣不僅**結構更加合理,而且,能夠實現**的復用和擴充套件,這是我最終的專案架構圖。

這樣的話,我們就實現了乙個通用的動態載入的可配置可擴充套件的框架示例。其實應該是挺簡單的,主要就是借助反射來實現動態載入和可擴充套件,借助配置檔案來做到可配置

原始碼我放到了github,有需要的請自取

--------------------------------------csdn:畫雞蛋的不止達文西

讓我們一起變的更優秀。

矩陣理論應用之反射變換的理解

設 sigma 是實平面r2r r2上的線性變換,其關於標準基的矩陣為 p css c p left begin end right p cs s c 其中c2 s2 1 c s 1 c2 s2 1,證明 sigma 是反射變換,並計算其對稱軸。由於det i p 2 1 operatorname ...

不想醜陋之實現動態url

urlpatterns url r admin include admin.site.urls url r index hello.views.index url r login hello.views.login url r logout hello.views.logout 前面我們這樣乙個個手...

Flutter之實現動態高斯模糊

flutter火了。google的fuchsia作業系統和配套的flutter開發框架在去年發布了preview版本,沉寂了一年之後在今年的google大會上又一次被提名,超高的渲染效能和android ios跨平台的特性讓它又一次被推向風口浪尖。最近準備開個flutter系列部落格的更新,以作知識...