依賴注入 - 設計模式

隨着 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 框架 ,都挺不錯的,這裏推薦一下:架構

  1. Autofac
  2. Sprint.Net
  3. Unit Container

其餘第三方的 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

相關文章
相關標籤/搜索