依赖注入 - 设计模式
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 框架 ,都挺不错的,这里推荐一下:
- 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 }
来不及提供具体如何实现的,把先把接口提供给大家。
以上是关于依赖注入 - 设计模式的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段