日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

在.Net 4.0下用dynamic为你的系统解耦

發布時間:2025/3/15 windows 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在.Net 4.0下用dynamic为你的系统解耦 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??? .Net的應用程序為了能夠使用已有的組件或者類庫,在.net 4.0以前唯一的方法就是去引用這個組件所在DLL,或者是引用該組件的聲明接口(Interface)的DLL然后做通過Activator或者是反射去構造該組件。無論如何你都要在你使用該組件Project里面做一個DLL的引用。雖然引用組件聲明接口的方法其實已經是耦合度不算高了,能夠把定義和實現分離了。但是很不幸的是好像微軟的開發人員都不喜歡將Interface單獨放置到一個DLL里面,一般都是有Interface然后就會在同一個DLL里面帶了個默認的實現(據說JAVA的好多實現都做到了Interface和實現沒有放置到同一個jar里面的)。使得引用DLL一般比較大,在一般情況下,如果你的程序不考慮升級,不是通用類庫考慮讓別人經常調用的話,這種做法是沒什么問題的。但是如果你提供的是一個通用的類庫而且你又使用了另外一個通用類庫(通常在企業里面開發自己的開發框架都會有這種情況,在自己的開發框架里面直接應用微軟的企業庫Enterprise Library)。在項目組想用你的框架的時候,發現微軟的企業庫已經升級了,他們想用最新的企業庫,而你的的框架又沒來得及升級的時候那就會變得很痛苦了,特別是使用的強名的。動不動就給你搞一個引用不匹配的錯誤出來。

???? 新的C#出來了,dynamic這個關鍵字讓我們看到了動態語言的特性了,于是就考慮著要不要用它來試試為我們的系統做一個解耦呢?于是做了個Sample,嘗試在一個沒有引用Unity的類庫里面直接試用Unity。

Project沒有引用任何跟Unity相關的東西,但是我們在代碼里面

Code public class DyActive{const string Con_ContainerName = "Container";public static Dictionary<string, object> Session { get; set; }public static void ActiveByDynamic(int times){Stopwatch watch = new Stopwatch();watch.Start();for (int i = 0; i < times; i++){dynamic container = Session[Con_ContainerName];ISubscriberRepository<object, object> repository = container.Resolve<ISubscriberRepository<object, object>>();try{Subscriber p = new Subscriber() { EmailAddress = "abce@g.cn" };repository.Add(p);}catch (ArgumentNullException ex){Console.WriteLine(string.Format("Parameter {0} is null.", ex.ParamName));}}watch.Stop();Console.WriteLine("Active By Dynamic! Elapsed:阰{0}", watch.ElapsedMilliseconds);}} 當然我們不會在這里構造Unity的Container的。

代碼寫好了,編譯也沒問題,那要在主程序里面調用看看能不能用了。

Main static void Main(string[] args){IUnityContainer container = new UnityContainer();var section = (UnityConfigurationSection)System.Configuration.ConfigurationManager.GetSection("unity");section.Containers[0].Configure(container);Session["Container"] = container;DyActive.Session = Session;System.Console.WriteLine("Times:{0}", times);DyActive.ActiveByDynamic(times);ActiveByInterface();times = 10000;System.Console.WriteLine("Times:{0}", times);DyActive.ActiveByDynamic(times);ActiveByInterface();times = 1000;System.Console.WriteLine("Times:{0}", times);DyActive.ActiveByDynamic(times);ActiveByInterface();times = 100;System.Console.WriteLine("Times:{0}", times);DyActive.ActiveByDynamic(times);ActiveByInterface();System.Console.WriteLine("Press 'Enter' to exit!");System.Console.ReadLine();}

?

?

?

?

?

?

?

使用這個類庫的時候就跟普通調用沒區別了。當然我們需要在Main里面構造好了Container然后再傳進去。

程序跑起來了,似乎一點問題都沒有,但是dynamic肯定會給系統帶來點損失的吧,如果這樣輕松解耦,而又不損失點什么的話那豈不是魚與熊掌可以兼得?第一時間肯定猜是性能有損失,但是具體損失多少呢?大家看看下面的結果

想不到吧,居然只是在第一次使用的時候慢了點(其實.net程序都這樣的)。其他時候Interface調用不相上下。

這應該是個比較滿意的結果了。看來微軟在IronPython上面的積累一點都沒白費啊!

Sample Code如果有興趣的話,可以短消息找我要。

?

?

轉載于:https://www.cnblogs.com/firewing/archive/2010/07/22/1782839.html

總結

以上是生活随笔為你收集整理的在.Net 4.0下用dynamic为你的系统解耦的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。