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