隨著 Asp.Net Mvc Core 發佈,給我的感覺,Microsoft(微軟) 一下子成了依賴註入的使用的瘋狂者,因為在我的印象中,依賴註入(Ioc DI)是業務程式員寫業務代碼時常用的,但像 Microsoft(微軟)把這個設計模式應用到了 Platform or Framework 上,這 ...
隨著 Asp.Net Mvc Core 發佈,給我的感覺,Microsoft(微軟) 一下子成了依賴註入的使用的瘋狂者,因為在我的印象中,依賴註入(Ioc DI)是業務程式員寫業務代碼時常用的,但像 Microsoft(微軟)把這個設計模式應用到了 Platform or Framework 上,這個實在罕見。這就導致在今後,你使用Microsoft(微軟)Platform 或者 Framework 可能連 new 這個 keyword 都接觸不到 , 當然了,這個是我的極端想法。但是大部分還是要用到的。
本人其實並不鐘情於設計模式,更不是 “分層架構控”。我見過很恐怖的“分層架構控”,把明明可以直接 Return 一個 object , 卻非要 Mapping 到 從 class name 到 property name 一模一樣,但卻又不是同樣的程式集上的 class , 用於返回。我記得這個框架好像叫啥 《EmitMapping》吧,我忘記了,實在無聊透頂。嗯,有把話題扯遠了。國慶前夕吧,很多人都問我什麼是依賴註入,我告訴他就是避免代碼緊密耦合,是一個鬆散耦合的設計模式。
我看了很多的關於 Ioc 框架 ,都挺不錯的,這裡推薦一下:
- Autofac
- Sprint.Net
- Unit Container
其他第三方的 Ioc 框架非常好,但不是我的 “風格”,一旦感覺自己好像能造輪子,就馬上自己寫一個屬於自己的 “風格”的吧。下麵,我會寫我自己的 Ioc 理解,並將它付諸於實踐,還是黨的話靠譜,真理是靠是實踐來檢驗的,是不是原句忘了,大概就是這個意思吧。
1.依賴 : 就是基類,Interface (介面), Abstract (抽象)
2.註入 : 就是一個 new 的過程,可能有容器模式實例化,可能其他模式。
所以,我也打算採用 Microsoft 的 IServiceProvider 的方式。
1 /// <summary> 2 /// 依賴類型 / 服務 3 /// </summary> 4 public interface IObjectDependency : IServiceProvider 5 { 6 /// <summary> 7 /// 獲取依賴類型:比如 baseClass , interface , abstract 等 8 /// </summary> 9 /// <returns></returns> 10 Type GetDependencyType(); 11 }
1 /// <summary> 2 /// 註入類型 / 服務 3 /// </summary> 4 public interface IObjectInjection : IServiceProvider 5 { 6 /// <summary> 7 /// 獲取註入的類型,比如 : baseClass , interface , abstract 等 implement 8 /// </summary> 9 /// <returns></returns> 10 Type GetInjectionType(); 11 /// <summary> 12 /// 註入 13 /// </summary> 14 /// <returns></returns> 15 object Injection(); 16 }
1 /// <summary> 2 /// 用於存儲實現或者繼承 IServiceProvider 介面的 集合 3 /// </summary> 4 /// <typeparam name="TKey">Key : 必須繼承 IServiceProvider</typeparam> 5 /// <typeparam name="TValue">Value : 必須繼承 IServiceProvider</typeparam> 6 public interface IServiceCollectionPair<TKey, TValue> : ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable 7 where TKey : IServiceProvider 8 where TValue : IServiceProvider 9 { 10 ICollection<TKey> Keys { get; } 11 12 ICollection<TValue> Values { get; } 13 14 TValue this[TKey key] { get; set; } 15 16 void Add(TKey key, TValue value); 17 }
1 /// <summary> 2 /// 依賴服務 3 /// </summary> 4 public interface IServiceDependency : IServiceProvider 5 { 6 /// <summary> 7 /// 來自繼承 <see cref="IServiceDependency"/> 介面的靜態實例 8 /// </summary> 9 IServiceDependency FormStaticSharedService { get; } 10 /// <summary> 11 /// 添加唯一依賴註入內容 12 /// </summary> 13 /// <typeparam name="TDependency">依賴類型</typeparam> 14 /// <typeparam name="TInjection">註入類型</typeparam> 15 void AddSingleDependency<TDependency, TInjection>(); 16 /// <summary> 17 /// 添加唯一依賴註入內容 18 /// </summary> 19 /// <param name="dependency">依賴類型</param> 20 /// <param name="injection">註入類型</param> 21 void AddSingleDependency(Type dependency, Type injection); 22 /// <summary> 23 /// 獲取唯一依賴註入實例 24 /// </summary> 25 /// <typeparam name="TDependency">依賴類型</typeparam> 26 /// <typeparam name="TInjection">註入類型</typeparam> 27 /// <returns>return 依賴類型 比如 : (baseClass , interface , abstract)</returns> 28 TDependency GetSingleService<TDependency, TInjection>(); 29 /// <summary> 30 /// 獲取多個依賴註入的實例 31 /// </summary> 32 /// <typeparam name="T">依賴類型 比如:(baseClass , interface , abstract)</typeparam> 33 /// <returns>return 依賴類型 實例</returns> 34 T[] GetService<T>(); 35 }
下麵,就是開始調用了,
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 ServiceDependency.SharedService.AddSingleDependency(typeof(ILogger), typeof(EventLogger)); 6 7 IServiceDependency formInstance = ServiceDependency.FormStaticServiceBuilder(); 8 formInstance.AddSingleDependency<ILogger, ConsoleLogger>(); 9 10 Console.WriteLine("static :"); 11 12 var static_loggers = ServiceDependency.SharedService.GetService<ILogger>(); 13 foreach (var logger in static_loggers) 14 { 15 logger.Print(); 16 } 17 18 Console.WriteLine("instance :"); 19 20 var instance_loggers = formInstance.FormStaticSharedService.GetService<ILogger>(); 21 foreach (var logger in instance_loggers) 22 { 23 logger.Print(); 24 } 25 26 Console.ReadLine(); 27 } 28 }
來不及提供具體如何實現的,把先把介面提供給大家。