隨着 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 框架 ,都挺不錯的,這裏推薦一下:架構
其餘第三方的 Ioc 框架很是好,但不是個人 「風格」,一旦感受本身好像能造輪子,就立刻本身寫一個屬於本身的 「風格」的吧。下面,我會寫我本身的 Ioc 理解,並將它付諸於實踐,仍是黨的話靠譜,真理是靠是實踐來檢驗的,是否是原句忘了,大概就是這個意思吧。app
1.依賴 : 就是基類,Interface (接口), Abstract (抽象)框架
2.注入 : 就是一個 new 的過程,可能有容器模式實例化,可能其餘模式。ide
因此,我也打算採用 Microsoft 的 IServiceProvider 的方式。ui
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 }
下面,就是開始調用了,this
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 }
來不及提供具體如何實現的,把先把接口提供給你們。 spa