依赖注入 - 设计模式

Posted 思想决定一切

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了依赖注入 - 设计模式相关的知识,希望对你有一定的参考价值。

随着 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 }

 

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

 

以上是关于依赖注入 - 设计模式的主要内容,如果未能解决你的问题,请参考以下文章

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

详解.NET Core 依赖注入生命周期

依赖注入[3]: 依赖注入模式

攻城狮学习时间~依赖注入设计模式

依赖注入 - 设计模式

大话设计模式--DI(依赖注入)