專利名稱:一種通過配置在運行時動態(tài)創(chuàng)建對象實例方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種計算機技術(shù),具體地說是一種通過配置在運行時動態(tài)創(chuàng)建對象實例方法。
背景技術(shù):
目前企業(yè)級應(yīng)用系統(tǒng)大多采用三層或者多層應(yīng)用模式。而大多數(shù)企業(yè)級應(yīng)用系統(tǒng)都選擇了面向?qū)ο蟮木幊碳夹g(shù)。所謂“對象”就是一個或一組數(shù)據(jù)以及處理這些數(shù)據(jù)的方法和過程的集合。對象的產(chǎn)生有兩種基本方式。一種是以原型(prototype)對象為基礎(chǔ)產(chǎn)生新的對象。一種是以類(class)為基礎(chǔ)產(chǎn)生新對象。而為了方便開發(fā)、部署、運行和管理基于多層架構(gòu)的應(yīng)用,需要依據(jù)不同語言的特性構(gòu)建一個完整的應(yīng)用框架。而對象的實現(xiàn)以及實例化就是這個框架中必不可少的部分。面向?qū)ο缶幊淘瓌t中有一條非常重要的原則就是面向接口編程而不面向其他什么編程。當前對象的實例化往往是在程序需要某個對象時創(chuàng)建對象實例,在不同的地方多次創(chuàng)建不同對象實例。并且是在程序編譯時創(chuàng)建的,這樣就導(dǎo)致系統(tǒng)在運行階段如果需要擴展功能,就必須重新編譯系統(tǒng)添加擴展的內(nèi)容。并且對于接口編程的實現(xiàn)往往需要在創(chuàng)建接口時針對某以實現(xiàn)創(chuàng)建接口。比如接口 IA通過A類實現(xiàn),那么在創(chuàng)建接口時就要通過 A實現(xiàn)。而當我們發(fā)現(xiàn)接口 IA提供的業(yè)務(wù)實現(xiàn)發(fā)生很大變化時,我們需要替換IA實現(xiàn)類A 為B類。當前編程實現(xiàn)往往需要重新查找這些實現(xiàn)并替換為B。很顯然以上對象實例的實現(xiàn)以及接口編程方法大大限制了程序的擴展功能,增大了編程復(fù)雜度,降低了開發(fā)效率。因此本領(lǐng)域技術(shù)人員迫切需要發(fā)展一種高效的、易于擴展的對象實例創(chuàng)建及接口編程方法,減少編程的復(fù)雜度提高開發(fā)效率。
發(fā)明內(nèi)容
本發(fā)明的技術(shù)任務(wù)是針對上述現(xiàn)有技術(shù)的不足,提供一種通過配置在運行時動態(tài)創(chuàng)建對象實例方法。該方法解決了程序運行時擴展及編程復(fù)雜度問題,并提高了編程的效率。本發(fā)明以控制反轉(zhuǎn)(IOC)容器保證上述方法的實現(xiàn)與應(yīng)用。本發(fā)明的技術(shù)任務(wù)是按以下方式實現(xiàn)的一種通過配置在運行時動態(tài)創(chuàng)建對象實例方法,包括
生成控制反轉(zhuǎn)容器,并能通過DLL創(chuàng)建實例;
讀取配置文件信息,并能根據(jù)配置信息加載對象;
敏捷實現(xiàn)接口編程;
實現(xiàn)面向接口編程與創(chuàng)建對象的融合;
當程序執(zhí)行時,能夠通過配置文件配置對象信息創(chuàng)建對象實例。
所述控制反轉(zhuǎn)(IOC)容器通過反射、泛型技術(shù)實現(xiàn)。所述配置文件信息配置了實體對象、業(yè)務(wù)對象、數(shù)據(jù)訪問對象程序集信息。配置文件信息中明確了業(yè)務(wù)對象所包含的數(shù)據(jù)對象,亦即實現(xiàn)業(yè)務(wù)對象所需要的數(shù)據(jù)對象支持。通過調(diào)用不同的創(chuàng)建方法,創(chuàng)建不同的對象實例,如果是DAO (數(shù)據(jù)邏輯對象)則創(chuàng)建數(shù)據(jù)對象實例;如果是SERVICE (業(yè)務(wù)邏輯)則創(chuàng)建業(yè)務(wù)對象實例,并判斷該業(yè)務(wù)邏輯對應(yīng)的數(shù)據(jù)對象創(chuàng)建數(shù)據(jù)對象實例。在運行時讀取配置文件信息,并讀取程序集信息,動態(tài)創(chuàng)建對象實例。與現(xiàn)有技術(shù)相比,本發(fā)明通過改變以往創(chuàng)建實例的方法,即通過配置文件配置出實體、業(yè)務(wù)、數(shù)據(jù)對象以及各對象之間的關(guān)系,通過反射、泛型等先進技術(shù)實現(xiàn)IOC容器,進而在系統(tǒng)運行時創(chuàng)建所需的對象實例,并切只創(chuàng)建一次數(shù)據(jù)對象實例,從而減少了創(chuàng)建對象實例的次數(shù),節(jié)省了內(nèi)存;并為系統(tǒng)擴展提供了運行時擴展的方法,以及統(tǒng)一了創(chuàng)建實例的方式;提高了編程效率;統(tǒng)一了接口實現(xiàn),降低了面向接口編程的復(fù)雜度。具體地說,本發(fā)明方法具有以下突出的有益效果
1、通過IOC容器統(tǒng)一了接口實現(xiàn)的方式,降低了面向接口編程的復(fù)雜度;
2、統(tǒng)一了對象實例創(chuàng)建、動態(tài)創(chuàng)建的方法;
3、對實體類、業(yè)務(wù)邏輯類、數(shù)據(jù)處理類分別處理;
4、提供系統(tǒng)擴展便利方式;
5、將創(chuàng)建對象實例與接編程融合在一起,對象實例創(chuàng)建、接口編程實現(xiàn)方式唯一并統(tǒng)
6、通過配置信息明確各程序集之間的關(guān)聯(lián)關(guān)系;
7、本技術(shù)實現(xiàn)簡單,無特殊保密算法;調(diào)用實現(xiàn)簡單易用;降低了編程的復(fù)雜度,進而提高了編程的效率。
附圖1是本發(fā)明通過配置在運行時動態(tài)創(chuàng)建對象實例方法的實現(xiàn)框架結(jié)構(gòu)圖; 附圖2是使用本發(fā)明方法的一個調(diào)用實現(xiàn)流程圖。
具體實施例方式參照說明書附圖以具體實施例對本發(fā)明的通過配置在運行時動態(tài)創(chuàng)建對象實例方法作以下詳細地說明。本發(fā)明方法適用于C#程序的對象實例創(chuàng)建及面向接口編程實現(xiàn)。其具體實現(xiàn)方式如附圖1所示。圖1所示的是一個標準的三層架構(gòu)的實現(xiàn)。業(yè)務(wù)實體、業(yè)務(wù)邏輯層、數(shù)據(jù)邏輯層都對應(yīng)一個相應(yīng)的接口。每個需要創(chuàng)建對象的需求體通過IOC容器創(chuàng)建接口對象。實例的具體創(chuàng)建由IOC容器實現(xiàn)。具體實現(xiàn)通過反射技術(shù)實現(xiàn)控制反轉(zhuǎn),通過對象屬性信息動態(tài)創(chuàng)建需要的對象實例。IOC容器創(chuàng)建什么實例、實例對應(yīng)的命名空間及對應(yīng)的DLL信息是通過配置文件信息中的name值,也就是接口類名稱,讀取接口實現(xiàn)對象的信息。然后根據(jù)具體實現(xiàn)對象創(chuàng)建接口。
1、配置文件具體信息如下 //數(shù)據(jù)邏輯對象信息定義 <daos>
<Dao name=〃ITestIOCPersistence〃 type="Genersoft· GS. JGHYB. ZCGL Persistence. TestlOCPersistencej Genersoft. GS. JGHYB. ZCGL. Persistence"〉 </Dao> </daos>
Il業(yè)務(wù)邏輯對象信息定義 〈service name="ITestIOCLogic"
type=^Genersoft. GS. JGHYB. ZCGL. BusinessLogic. TestIOCLogicjGenersoft. GS. JGHYB. ZCGL. BusinessLogic^ IsShared=〃true〃>
〈property name=〃TestIOCPersistence〃>
<dao>ITestIOCPersistence</dao> 〈/property〉
</service)
Il業(yè)務(wù)實體對象信息定義
〈modules〉 〈module name="ITestSPI"
type=〃Genersoft. GS. JGHYB. ZCGL. SPI. TestSPIj Genersoft. GS. JGHYB. ZCGL.
SPI">
</module> 〈/modules〉 2、創(chuàng)建對象實例實現(xiàn) 1)業(yè)務(wù)實體對象實例創(chuàng)建 III <summary)
III指定類型生成新的業(yè)務(wù)實體對象 III </summary)
III <typeparam name="T"> 業(yè)務(wù)實體的類型 </typ印aram> III〈returns〉新的業(yè)務(wù)實體對象〈/returns〉 Il傳入的實體對象名稱是否為配置文件中的對象
if (moduleDynamicMethods. ContainsKey(moduleName))
{
//取得對象信息
object module = moduleDynamicMethods[moduleName](); Il根據(jù)對象屬性創(chuàng)建對象信息
PropertyInfo pi = GetPropertyInfo(obj. GetType(), propertyName);(T)module=pi. GetValue (obj, null);
}
return default (T);
2)業(yè)務(wù)邏輯對象實例創(chuàng)建
Type serviceType = Type. GetType(typeName); Il通過反射動態(tài)創(chuàng)建類的實例
IService service = (IService)Activator. CreateInstance (serviceType);
Il以下代碼創(chuàng)建關(guān)聯(lián)的數(shù)據(jù)邏輯對象
XmlNodeList list2 = node. SelectNodes("property");
foreach (XmlNode node2 in list2)
{
string name = node2. Attributes. GetNamedItem (〃name〃)· Value; object value = GetPropertyValue(node2); Il通過反射創(chuàng)建關(guān)聯(lián)類的實例,并設(shè)置共用屬性 ReflectUtil. SetPropertyValue(service, name, value);
ι
return service;
3)數(shù)據(jù)邏輯對象實例創(chuàng)建
Dictionary<string, object> daolnstances = new Dictionary<string, object>(); //配置信息中存在daos配置項
if (node != null)
{
//取得數(shù)據(jù)對象配置信息列表
XmlNodeList list = node. SelectNodes("Dao");
Il循環(huán)列表信息并創(chuàng)建相應(yīng)的數(shù)據(jù)對象實例,并添加到dictionary結(jié)構(gòu)中
foreach (XmlNode daoNode in list) {
string typeName = daoNode. Attributes. GetNamedItem(〃type〃)· Value; //讀取TYPE信息 Type type = Type. GetType(typeName); Il通過反射創(chuàng)建實例
object daolnstance = Activator. CreateInstance (type); Il添加實例
daolnstances. Add(daoNode. Attributes. GetNamedItem(〃name〃)·Value,
daolnstance);
ι
ι
return daolnstances;
4)配置文件讀取Il取得系統(tǒng)運行路徑
string args = System.AppDomain.CurrentDomain. SetupInformation. ApplicationBase;
XmlDocument xmlDoc = new XmlDocument(); Il加載配置文件 xmlDoc. Load(args + ^JghybConfig/Jghyb. Config^);
//讀取所有節(jié)點 XmlNodeList nodeList =
xmlDoc. SelectSingleNode(^configuration/opp. config"). ChildNodes; //取得opp. config節(jié)點信息
XmlNode webfxNode = xmlDoc. SelectSingleNode ("configuration/opp.
config〃);
3、具體實施步驟如圖2所示
1、在使用本方法時首先要定義系統(tǒng)的配置文件信息,將實體類、業(yè)務(wù)邏輯對象、數(shù)據(jù)邏輯對象的接口及實現(xiàn)對象信息在配置文件的不同節(jié)點中進行配置。具體為
Daos配置數(shù)據(jù)邏輯對象dao為具體某一個數(shù)據(jù)邏輯對象。Service配置業(yè)務(wù)邏輯對象property是需要調(diào)用的數(shù)據(jù)邏輯對象實例名,dao是 daos中配置的對應(yīng)的dao結(jié)name。Modules配置業(yè)務(wù)實體對象module為具體某一個業(yè)務(wù)實體對象信息。2、如果業(yè)務(wù)邏輯對象調(diào)用了數(shù)據(jù)邏輯對象,則需要配置property節(jié)點。3、配置文件信息配置完成后,在需要創(chuàng)建對象實例的項目中引入該方法的實現(xiàn)數(shù)據(jù)包-DLL
4、創(chuàng)建具體的對象對應(yīng)的類以及接口
在需要創(chuàng)建對象實例的地方調(diào)用該方法的GeModule、Getkrvice、GetDao方法分別創(chuàng)建實體類實例、業(yè)務(wù)邏輯實例、數(shù)據(jù)邏輯實例。
權(quán)利要求
1.一種通過配置在運行時動態(tài)創(chuàng)建對象實例方法,其特征在于所述方法包括生成控制反轉(zhuǎn)容器,并能通過DLL創(chuàng)建實例;讀取配置文件信息,并能根據(jù)配置信息加載對象;敏捷實現(xiàn)接口編程;實現(xiàn)面向接口編程與創(chuàng)建對象的融合;當程序執(zhí)行時,能夠通過配置文件配置對象信息創(chuàng)建對象實例。
2.根據(jù)權(quán)利要求1所述的通過配置在運行時動態(tài)創(chuàng)建對象實例方法,其特征在于通過反射、泛型技術(shù)實現(xiàn)控制反轉(zhuǎn)容器。
3.根據(jù)權(quán)利要求1所述的通過配置在運行時動態(tài)創(chuàng)建對象實例方法,其特征在于配置文件信息配置了實體對象、業(yè)務(wù)對象、數(shù)據(jù)訪問對象程序集信息。
4.根據(jù)權(quán)利要求3所述的通過配置在運行時動態(tài)創(chuàng)建對象實例方法,其特征在于配置文件信息中明確了業(yè)務(wù)對象所包含的數(shù)據(jù)對象,亦即實現(xiàn)業(yè)務(wù)對象所需要的數(shù)據(jù)對象支持。
5.根據(jù)權(quán)利要求4所述的通過配置在運行時動態(tài)創(chuàng)建對象實例方法,其特征在于通過調(diào)用不同的創(chuàng)建方法,創(chuàng)建不同的對象實例,如果是實體類則創(chuàng)建實體對象實例;如果是數(shù)據(jù)邏輯對象則創(chuàng)建數(shù)據(jù)對象實例;如果是業(yè)務(wù)邏輯則創(chuàng)建業(yè)務(wù)對象實例,并判斷該業(yè)務(wù)邏輯對應(yīng)的數(shù)據(jù)對象創(chuàng)建數(shù)據(jù)對象實例。
6.根據(jù)權(quán)利要求1所述的通過配置在運行時動態(tài)創(chuàng)建對象實例方法,其特征在于在運行時讀取配置文件信息,并讀取程序集信息,動態(tài)創(chuàng)建對象實例。
全文摘要
本發(fā)明公開了一種通過配置在運行時動態(tài)創(chuàng)建對象實例方法,屬于計算機技術(shù)領(lǐng)域。該方法包括生成控制反轉(zhuǎn)容器,并能通過DLL創(chuàng)建實例;讀取配置文件信息,并能根據(jù)配置信息加載對象;敏捷實現(xiàn)接口編程;實現(xiàn)面向接口編程與創(chuàng)建對象的融合;當程序執(zhí)行時,能夠通過配置文件配置對象信息創(chuàng)建對象實例。與現(xiàn)有技術(shù)相比,本發(fā)明方法解決了程序運行時擴展及編程復(fù)雜度問題,并提高了編程的效率,可廣泛地應(yīng)用于設(shè)計計算機軟件C#對象實例創(chuàng)建過程。
文檔編號G06F9/44GK102393817SQ20111017579
公開日2012年3月28日 申請日期2011年6月28日 優(yōu)先權(quán)日2011年6月28日
發(fā)明者杜正濤 申請人:浪潮集團山東通用軟件有限公司