依赖注入 - 设计模式

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

相关文章
相关标签/搜索