日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
工作多年后才明白的.NET底層開(kāi)發(fā)技術(shù)

參加工作已經(jīng)有五年了。由于是非計(jì)算機(jī)科系,一開(kāi)始的工作是做網(wǎng)頁(yè),維護(hù)ASP腳本程序,有時(shí)候也要做圖片,總而言之,一項(xiàng)任務(wù)交到手里,沒(méi)有借口說(shuō)不會(huì)做,想辦法彌補(bǔ)然后把任務(wù)做完。后來(lái)才得到機(jī)會(huì),參與編程開(kāi)發(fā)工作。而且,當(dāng)時(shí)一心想用C#.NET做開(kāi)發(fā),不希望參與DELPHI的開(kāi)發(fā),偏偏工作經(jīng)過(guò)層層的轉(zhuǎn)發(fā),交到手里的就是DELPHI開(kāi)發(fā)。經(jīng)歷努力,再后來(lái)就真的用.NET進(jìn)行開(kāi)發(fā)工作,一直持續(xù)到現(xiàn)在。消極的觀念會(huì)說(shuō),學(xué)的很雜,做的也雜,積極一點(diǎn)的想法,把老板交給你的任務(wù)完成,就是稱職的員工?,F(xiàn)在正值畢業(yè)生找工作的時(shí)間,一時(shí)找不到開(kāi)發(fā)的工作,也不要急,先聽(tīng)從公司的安排做個(gè)軟件測(cè)試,或是文檔管理之類的職位,等有空缺的開(kāi)發(fā)人員的機(jī)會(huì),你再毛遂自薦,同樣可以進(jìn)入程序員這個(gè)領(lǐng)域。機(jī)會(huì)是留給有準(zhǔn)備的人的,難道不是嗎?

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出大英免費(fèi)做網(wǎng)站回饋大家。

一直用.NET做ERP/MIS類型的軟件,學(xué)業(yè)不精,可以完成工作任務(wù),業(yè)余時(shí)間也制作一些集成化的工具包,下面分享一下我認(rèn)為的.NET領(lǐng)域里的底層技術(shù)。

1 通信技術(shù)(Remoting,WCF, ASMX)

通常的三層架構(gòu),數(shù)據(jù)庫(kù),數(shù)據(jù)訪問(wèn)層,界面層。通訊技術(shù)定義了三層組件之間的調(diào)用約定,以及方法。這樣說(shuō)起來(lái)有些抽象,舉例為證?,F(xiàn)在要制作一個(gè)進(jìn)銷(xiāo)存項(xiàng)目,基本的功能是進(jìn)倉(cāng),出倉(cāng),轉(zhuǎn)倉(cāng),查詢功能要能查詢到倉(cāng)庫(kù)進(jìn)出日記帳,

庫(kù)存余額。對(duì)于一筆物料為FLEX0901的進(jìn)倉(cāng)業(yè)務(wù),用ORM的方式完成,偽代碼如下

 
 
 
 
  1. InventoryMovmentEntity  receipt=new InventoryMovmentEntity(“REF1108080001”,"RECEIPT”);   
  2. InventoryMovmentDetailEntity  detail=receipt.InventoryMovmentDetails.AddNew();    
  3. detail.ItemNo=”FLEX0901”;   
  4. detail.MoveDate=DateTime.Now;   
  5. InventoryMovementDAL.Instance.Save(receipt);  

這里有幾個(gè)問(wèn)題處理的不錯(cuò),比如

1) ORM的數(shù)據(jù)讀寫(xiě),關(guān)注面從拼湊SQL讀寫(xiě)到構(gòu)建實(shí)體,這是進(jìn)步。如果用DAL+SQL Script的方式完成,偽碼如下

 
 
 
 
  1. string mySql=”INSERT ICMOVH(RefNo,Direction)   VALUES(‘REF1108080001’, 'RECEIPT’) ";   
  2. InventoryMovementDAL.Instance.ExecuteNonQuery(mySql);   
  3. mySql=”INSERT ICMOVD(ItemNo,MoveDate) VALUES(‘FLEX0901’,'2011/8/8’) ";   
  4. InventoryMovementDAL.Instance.ExecuteNonQuery(mySql);  

這里省略了拼湊參數(shù)值的句段,直接把值放到SQL語(yǔ)句中去。

后一種方式,明顯的缺陷時(shí),當(dāng)添加新的字段,對(duì)系統(tǒng)擴(kuò)展時(shí),修改和維護(hù)起來(lái)的成本,明顯大于前者。

2) 使用了單件模式,InventoryMovementDAL.Instance來(lái)統(tǒng)一操作數(shù)據(jù)讀寫(xiě),而不是這樣

 
 
 
 
  1. InventoryMovementDAL  inventoryDAL=new InventoryMovementDAL();   
  2. inventoryDAL.Save(receipt);  

從這個(gè)單件模式,引出了通訊技術(shù)的必要性。當(dāng)有很多個(gè)用戶,同時(shí)操作進(jìn)倉(cāng)功能,意味著同時(shí)有很多個(gè)InventoryMovementDAL的數(shù)據(jù)寫(xiě)入操作,這時(shí)產(chǎn)生的問(wèn)題

◆ 不好控制前后兩張單據(jù)的進(jìn)倉(cāng)單參考編號(hào)重復(fù)。為保證不重復(fù),在保存之前,我們需要到數(shù)據(jù)庫(kù)檢查一次是否已經(jīng)存在該參考編號(hào)的進(jìn)倉(cāng)單,也就是InventoryMovementDAL的Save方法的開(kāi)頭,

要包含這樣一段代碼,以DAL+SQL Script的方式表示

 
 
 
 
  1. tring mySql=” SELECT COUNT(1) FROM ICMOVH WHERE RefNo=’REF1108080001’  ";   
  2. bool existing=InventoryMovementDAL.Instance.ExecuteScalar(mySql)>0;  

可以想像,當(dāng)并發(fā)用戶為100時(shí),每一筆進(jìn)倉(cāng)業(yè)務(wù),需要預(yù)先一次數(shù)據(jù)檢查,來(lái)回于數(shù)據(jù)庫(kù),這樣的程序性能肯定不好。

◆ 對(duì)于庫(kù)存報(bào)表,多個(gè)并發(fā)的InventoryMovementDAL會(huì)導(dǎo)致數(shù)據(jù)前后不統(tǒng)一。庫(kù)存余額報(bào)表現(xiàn)在可以讀到物料FLEX0901還有100個(gè)pc,一會(huì)當(dāng)有進(jìn)倉(cāng)單入庫(kù)200pc的FLEX0901時(shí),如果不手動(dòng)刷新數(shù)據(jù),此時(shí)的報(bào)表仍然顯示的物料FLEX0901的庫(kù)存余額是100,而不是300. 這有時(shí)候是不可接受的結(jié)果。

可以做一個(gè)timer,定期刷新庫(kù)存余額。這里的問(wèn)題是,InventoryMovementDAL只有一個(gè)實(shí)例,無(wú)法自己告訴自己,已經(jīng)有新的庫(kù)存了,重新讀取數(shù)據(jù)。這里需要一種并發(fā)機(jī)制,告訴InventoryMovementDAL實(shí)例,有新的數(shù)據(jù)加入到庫(kù)存余額中,需要刷新報(bào)表。

◆ 有一些數(shù)據(jù)項(xiàng),是全局的,對(duì)于整個(gè)系統(tǒng)都是唯一的,需要特殊處理。

比如ERP系統(tǒng)允許的并發(fā)用戶,同時(shí)允許有10個(gè)用戶連接進(jìn)入系統(tǒng),超過(guò)則無(wú)法處理;

ERP系統(tǒng)的一個(gè)用戶把當(dāng)前系統(tǒng)的默認(rèn)貨幣從HK$改進(jìn)了US$,其它的用戶,要能知道這個(gè)改變,此時(shí),不太可能讓當(dāng)前正在操作業(yè)務(wù)的用戶退出,重新進(jìn)入系統(tǒng);

當(dāng)發(fā)生網(wǎng)絡(luò)故障時(shí),ERP系統(tǒng)要能知道網(wǎng)絡(luò)故障,并suspend當(dāng)前正在進(jìn)行的操作;這一點(diǎn)可以理解為一條有效的改善,當(dāng)無(wú)法連接到SQL Server時(shí),要阻止當(dāng)前正在錄入數(shù)據(jù)的用戶,否則他很辛苦的錄入了數(shù)據(jù),而系統(tǒng)又無(wú)法保存,給出一個(gè)提示A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections 用戶會(huì)抱怨你的軟件沒(méi)有做好,盡管這不是你的錯(cuò)。

如下圖,當(dāng)前用戶正在編輯客戶資料,發(fā)生網(wǎng)絡(luò)故障,界面被Disable了。借助于通訊技術(shù)中的并發(fā),可以實(shí)現(xiàn)。

通篇都沒(méi)有給Remoting,WCF打廣告,說(shuō)Remoting,WCF的好處。當(dāng)你的程序遇到這幾個(gè)問(wèn)題時(shí),是否可以考慮下通訊技術(shù),來(lái)改善性能和客戶體驗(yàn)。

2 反射,動(dòng)態(tài)編譯

反射是動(dòng)態(tài)獲取程序集的元數(shù)據(jù)的一種技術(shù),這句話是做.NET程序員面試題目的一個(gè)的答案,你可選擇記住它,就好比高中生物學(xué)里面講到的細(xì)胞的結(jié)構(gòu)的課程時(shí),細(xì)胞由細(xì)胞膜,細(xì)胞質(zhì)和細(xì)胞核組成。根據(jù)做程序的經(jīng)驗(yàn),Never ask why不是好習(xí)慣,即使是微軟的API,有時(shí)候違反了調(diào)用約定,也會(huì)很抓狂。

請(qǐng)看下面這一段代碼

 
 
 
 
  1. Assembly assembly = Assembly.GetExecutingAssembly();  
  2. object entryForm = Activator.CreateInstance(formBaseType) as Form;  
  3. entryForm .MdiParent = this;   
  4. entryForm .Show();   
  5. entryForm .Activate();  

代碼的含義比較簡(jiǎn)單,從當(dāng)前程序集中創(chuàng)建formBaseType類型,并調(diào)用它的方法。從方法名上來(lái)看,大概可以看出,這是一段MDI創(chuàng)建child子窗體,并顯示子窗體的代碼。

這段小代碼,也是插件式框架的基本思路,請(qǐng)參考《Management Console 工具管理類軟件通用開(kāi)發(fā)框架(開(kāi)放源碼)》中的例子來(lái)體會(huì)它的用處。

在ERP/MIS系統(tǒng)中,應(yīng)用反射的例子,實(shí)在是太多了。數(shù)據(jù)訪問(wèn)接口InventoryMovementDAL,借助于反射,來(lái)查找并調(diào)用它的實(shí)現(xiàn)類; 窗體也它的子窗體借助于反射來(lái)獲取屬性,傳遞值;ERP系統(tǒng)的整個(gè)框架,也是借助于反射搭建起來(lái).

看下面的圖,ERP的三個(gè)模塊Paradox.ERP.SystemAdministration, Paradox.ERP.Engineering,Paradox.ERP.Inventory被Paradox.Framework.Kernal反射調(diào)用,如果再寫(xiě)一個(gè)Paradox.ERP.Sales的銷(xiāo)售模塊,幾乎不需要改動(dòng),就可以讓它被框架調(diào)用。

動(dòng)態(tài)編譯的例子,是應(yīng)用到一個(gè)工資系統(tǒng)中. 請(qǐng)看圖

對(duì)于如何解析工資的formular公式,有若干種辦法,這里使有的是動(dòng)態(tài)編譯的方法。把每一個(gè)工資項(xiàng)看成是一個(gè)類型class的屬性,F(xiàn)ormular的內(nèi)容則放到一個(gè)方法中去,當(dāng)成表達(dá)式計(jì)算求職,最后應(yīng)用反射,返回各屬性的值即可。

 
 
 
 
  1. public class FormularCalculation   
  2.     {   
  3.         public static object Build(string[] items, string formular)   
  4.         {   
  5.             string nameSpace = "A";   
  6.             string className = "FormularCalculation";   
  7.             string methodName = "Run";   
  8.             CSharpCodeProvider compiler = new CSharpCodeProvider();   
  9.             CompilerParameters paras = new CompilerParameters();   
  10.             paras.GenerateExecutable = false;   
  11.             paras.GenerateInMemory = true;   
  12.               
  13.            StringBuilder classSrc = new StringBuilder();   
  14.             classSrc.Append(" using  System;"+Environment.NewLine);   
  15.             classSrc.Append(" namespace "+nameSpace+" { " + Environment.NewLine);   
  16.             classSrc.Append("public  class  " + className + "{ " + Environment.NewLine);   
  17.             foreach (string item in items)   
  18.             {   
  19.                 classSrc.Append("public decimal " + item + ";" + Environment.NewLine);   
  20.             }   
  21.             classSrc.Append("public  void Run() { 基本工資=5000; " + Environment.NewLine);   
  22.              string [] format= Regex.Split(formular,Environment.NewLine);   
  23.              foreach (string prop in format)   
  24.              {   
  25.                  classSrc.Append(prop +" ;"+ Environment.NewLine);   
  26.              }   
  27.             classSrc.Append("}"+Environment.NewLine);   
  28.             classSrc.Append("}" + Environment.NewLine);   
  29.             classSrc.Append("}" + Environment.NewLine);   
  30.             string source = classSrc.ToString();   
  31.  
  32.             CompilerResults result = compiler.CompileAssemblyFromSource(paras, source);  
  33.             CompilerErrorCollection error= result.Errors;   
  34.             Assembly assembly = result.CompiledAssembly;   
  35.             object eval = assembly.CreateInstance(nameSpace+"."+className);   
  36.             MethodInfo method = eval.GetType().GetMethod(methodName);   
  37.             object reobj = method.Invoke(eval, null);   
  38.             return eval;   
  39.         }   
  40.     }  

調(diào)用方法如下

string[] items = { "應(yīng)發(fā)合計(jì)","基本工資","獎(jiǎng)金","福利費(fèi)", "扣款合計(jì)","社保","稅","實(shí)發(fā)合計(jì)","應(yīng)稅所得額"};

string formular=@ ” 應(yīng)發(fā)合計(jì)=基本工資+ 獎(jiǎng)金 + 福利費(fèi) - 扣款合計(jì);

扣款合計(jì)=社保 + 稅+ 應(yīng)稅所得額;

實(shí)發(fā)合計(jì)=應(yīng)發(fā)合計(jì)- 扣款合計(jì); ";

 
 
 
 
  1. object obj = FormularCalculation.Build(items, formular);   
  2.             Type type = obj.GetType();   
  3.             foreach (PropertyInfo fi in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public   
  4.                                                | BindingFlags.Instance | BindingFlags.DeclaredOnly))   
  5.             {   
  6.                 string value = fi.Name;  //取到計(jì)算后的各個(gè)屬性的值   
  7.             }  

動(dòng)態(tài)編譯還應(yīng)用于軟件的加密,在內(nèi)存中產(chǎn)生加密程序的源代碼,動(dòng)態(tài)編譯并運(yùn)行,檢測(cè)是否符合license授權(quán)。

3 ORM(NHibernate,LLBL Gen) 對(duì)象關(guān)系映射

雖然可以找出很多理由來(lái)拒絕ORM,比如performance不好,接口不好用,沒(méi)有NHibernate設(shè)計(jì)器,是的,這都是理由。但是,一旦接觸過(guò)ORM之后,我發(fā)現(xiàn)做系統(tǒng)再也離不開(kāi)這個(gè)工具。相對(duì)于ERP/MIS類的系統(tǒng),大部分時(shí)間都是和SQL的讀寫(xiě)在搏斗,ORM帶給你的幾個(gè)好處,是不可忽視的。

1) 增加或刪除數(shù)據(jù)庫(kù)字段,界面和程序幾乎不需要改動(dòng)。這一點(diǎn)我非常認(rèn)同,即使是很穩(wěn)定的系統(tǒng),也避免不了要做customization,也要加些字段,如果用SQL拼湊,你幾乎要改動(dòng)所有的相關(guān)內(nèi)容,而且還無(wú)法獲取編譯器的語(yǔ)法檢查的好處,ORM在編譯期間就可以檢測(cè)出一些類型不匹配的問(wèn)題。

2 )界面和邏輯的真正分離 改動(dòng)計(jì)算邏輯,不需要改動(dòng)界面,也就是實(shí)現(xiàn)MVC,MVP的模式,其實(shí)我們可以不用管這兩個(gè)模式,我們只是在用ORM來(lái)讀寫(xiě)數(shù)據(jù)庫(kù)。

3 )代碼更幽雅,調(diào)試起來(lái)更容易,維護(hù)方便。

Linq技術(shù)之后,微軟大力發(fā)展Entity Framework,不推薦在項(xiàng)目中使用。MS的優(yōu)點(diǎn)是,它發(fā)現(xiàn)一項(xiàng)技術(shù)很有用,或?yàn)殚_(kāi)發(fā)一個(gè)很得力的工具,最終它會(huì)做的很好,比如Visual Studio,Office,但是這是需要時(shí)間的,它要不停的學(xué)習(xí),觀察,改善,特別像API這類的東西,如果更新太快,會(huì)對(duì)項(xiàng)目產(chǎn)生較大的風(fēng)險(xiǎn),實(shí)際項(xiàng)目中最需要的是穩(wěn)定的API。MS打算要放棄的東西,它會(huì)慢慢減少資源,慢慢減少關(guān)注的次數(shù),時(shí)間一長(zhǎng),最后就淡出了開(kāi)發(fā)人員的視線。

NHibernate經(jīng)過(guò)多年的發(fā)展,穩(wěn)定,好用,有龐大的Java社區(qū)(Hibernate)的支持,不愁遇到問(wèn)題沒(méi)有答案。

4 工作流 Workflow

目前微軟推出了兩個(gè)版本的工作流,.NET 3.5和.NET 4.0的,應(yīng)該把它看成兩個(gè)產(chǎn)品,并不是簡(jiǎn)單的版本升級(jí)。

ERP/MIS領(lǐng)域常見(jiàn)的需求有

1)采購(gòu)單審批(如果條件) 要求:

當(dāng)金額大于等于500且采購(gòu)員為A時(shí),需要通過(guò)May的審批

當(dāng)金額大于等于500且采購(gòu)員為B時(shí),需要通過(guò)Jack的審批

當(dāng)金額小于500時(shí),不需要通過(guò)審批,可直接過(guò)帳

2 ) 當(dāng)發(fā)生工程更改ECN時(shí),要通知生產(chǎn)部重排計(jì)劃,通知貨倉(cāng)安排發(fā)料。

像這種類型的需求,每個(gè)企業(yè)的要求都不一樣,要達(dá)到定制的目的,又不想為每個(gè)不同的客戶分別寫(xiě)代碼,非用到工作流不可。你可以不選擇用工作流,那就為不同的客戶定制代碼,也行。

MS的工作流也做成了中間件,你需要盡可能的override

請(qǐng)通過(guò)查看《信息化基礎(chǔ)建設(shè) 工作流開(kāi)發(fā)》,了解更多關(guān)于工作流的心得體會(huì)。

原文:http://www.cnblogs.com/JamesLi2015/archive/2011/08/09/2131729.html

【編輯推薦】

  1. .NET簡(jiǎn)談設(shè)計(jì)模式之抽象工廠模式
  2. 淺析.NET設(shè)計(jì)架構(gòu)十條箴言
  3. Scala登陸.NET平臺(tái)
  4. 各大主流.Net的IOC框架性能測(cè)試比較
  5. 微軟ASP.NET MVC 4路線圖曝光

網(wǎng)站欄目:工作多年后才明白的.NET底層開(kāi)發(fā)技術(shù)
轉(zhuǎn)載源于:http://m.5511xx.com/article/cogdpeg.html