在.Net 4.0下用dynamic为你的系统解耦
??? .Net的應(yīng)用程序為了能夠使用已有的組件或者類庫,在.net 4.0以前唯一的方法就是去引用這個組件所在DLL,或者是引用該組件的聲明接口(Interface)的DLL然后做通過Activator或者是反射去構(gòu)造該組件。無論如何你都要在你使用該組件Project里面做一個DLL的引用。雖然引用組件聲明接口的方法其實已經(jīng)是耦合度不算高了,能夠把定義和實現(xiàn)分離了。但是很不幸的是好像微軟的開發(fā)人員都不喜歡將Interface單獨放置到一個DLL里面,一般都是有Interface然后就會在同一個DLL里面帶了個默認(rèn)的實現(xiàn)(據(jù)說JAVA的好多實現(xiàn)都做到了Interface和實現(xiàn)沒有放置到同一個jar里面的)。使得引用DLL一般比較大,在一般情況下,如果你的程序不考慮升級,不是通用類庫考慮讓別人經(jīng)常調(diào)用的話,這種做法是沒什么問題的。但是如果你提供的是一個通用的類庫而且你又使用了另外一個通用類庫(通常在企業(yè)里面開發(fā)自己的開發(fā)框架都會有這種情況,在自己的開發(fā)框架里面直接應(yīng)用微軟的企業(yè)庫Enterprise Library)。在項目組想用你的框架的時候,發(fā)現(xiàn)微軟的企業(yè)庫已經(jīng)升級了,他們想用最新的企業(yè)庫,而你的的框架又沒來得及升級的時候那就會變得很痛苦了,特別是使用的強名的。動不動就給你搞一個引用不匹配的錯誤出來。
???? 新的C#出來了,dynamic這個關(guān)鍵字讓我們看到了動態(tài)語言的特性了,于是就考慮著要不要用它來試試為我們的系統(tǒng)做一個解耦呢?于是做了個Sample,嘗試在一個沒有引用Unity的類庫里面直接試用Unity。
Project沒有引用任何跟Unity相關(guān)的東西,但是我們在代碼里面
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);}} 當(dāng)然我們不會在這里構(gòu)造Unity的Container的。代碼寫好了,編譯也沒問題,那要在主程序里面調(diào)用看看能不能用了。
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();}?
?
?
?
?
?
?
使用這個類庫的時候就跟普通調(diào)用沒區(qū)別了。當(dāng)然我們需要在Main里面構(gòu)造好了Container然后再傳進去。
程序跑起來了,似乎一點問題都沒有,但是dynamic肯定會給系統(tǒng)帶來點損失的吧,如果這樣輕松解耦,而又不損失點什么的話那豈不是魚與熊掌可以兼得?第一時間肯定猜是性能有損失,但是具體損失多少呢?大家看看下面的結(jié)果
想不到吧,居然只是在第一次使用的時候慢了點(其實.net程序都這樣的)。其他時候Interface調(diào)用不相上下。
這應(yīng)該是個比較滿意的結(jié)果了。看來微軟在IronPython上面的積累一點都沒白費啊!
Sample Code如果有興趣的話,可以短消息找我要。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/firewing/archive/2010/07/22/1782839.html
總結(jié)
以上是生活随笔為你收集整理的在.Net 4.0下用dynamic为你的系统解耦的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内科技博客盘点
- 下一篇: 提高编写CSS代码效率的10个习惯