首页 > 代码库 > 依赖注入 - 设计模式

依赖注入 - 设计模式

随着 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 理解,并将它付诸于实践,还是党的话靠谱,真理是靠是实践来检验的,是不是原句忘了,大概就是这个意思吧。

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 }

技术分享

 

 来不及提供具体如何实现的,把先把接口提供给大家。                                                                                               

 

依赖注入 - 设计模式