Fork me on GitHub

从入门到放弃,.net构建博客系统(二):依赖注入

文章目录:《从入门到放弃,.net构建博客系统》

 

上一篇中有讲到项目启动时会进行ioc的依赖注入,但具体是怎么注入的呢?我们先一步步往下走

一、注册autofac配置

首先bootstraper会进行初始化,接着将当前mvc控制器工厂改为AutofacControllerFactory。

 1 public class AutofacConfig
 2     {
 3         /// <summary>
 4         /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
 5         /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
 6         /// </summary>
 7         public static void Register()
 8         {
 9             Bootstrapper boot = new Bootstrapper();
10             boot.Start();
11 
12             //将MVC的控制器对象实例 交由autofac来创建
13             ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory());
14         }
15     }
View Code

 

二、bootstraper开始注册服务

在注册服务前,我们先定义一个容器生成器ContainerBuilder,用以注册服务;接着我们会获取当前项目所有引用的程序集,对其中的类型进行判断,如果符合条件就会注册进去。那哪些类型会注册进去呢?

有三种:

  1. IDependency,仓储层和服务层的接口都继承该接口,注册的服务会在容器每次resolve的时候,生成一个新对象

  2. ISignleton,日志和缓存接口继承该接口,每次解析都会返回统一对象,即单例对象

  3. Module,其中暴露了ContainerBuilder对象,由模块自定义注册方式,项目中webapp层有个MvcControllerModule,用于将所有实现IController给注册进去

 1 public void Start()
 2         { 
 3             Type baseType = typeof(IDependency);
 4 
 5             // 获取所有相关类库的程序集
 6             Assembly[] assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
 7             
 8             containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
 9                 .AsImplementedInterfaces().InstancePerDependency();//每次解析获得新实例
10 
11             Type singletonType = typeof(ISignleton);
12             containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => singletonType.IsAssignableFrom(type) && !type.IsAbstract)
13                 .AsImplementedInterfaces().SingleInstance();// 保证对象生命周期基于单例
14 
15             containerBuilder.RegisterAssemblyModules(assemblies);//所有继承module中的类都会被注册
16 
17             var container = containerBuilder.Build();
18             ContainerManager.SetContainer(container);
19         }
View Code

依赖注册好后,会生成IOC容器,接着将容器管理器的IOC容器设置为该容器,以后所有的服务的解析可以通过管理器来解析。

 

 三、自定义Autofac控制器工厂

第一步中我们将控制器工厂改为AutofacControllerFactory,这个控制器工厂重写了GetControllerInstance,主要在解析控制器类型时,用ContainerManager去解析控制器类型,这样就能把控制器中的依赖给注入进去。

1 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
2         {
3             if (controllerType == null)
4             {
5                 return base.GetControllerInstance(requestContext, controllerType);
6             }
7 
8             return ContainerManager.Resolve(controllerType) as IController;
9         }
View Code

 

demo:http://tonyblogs.top/

Git源码https://github.com/Halifa/TonyBlogs

如本文对您有帮助请移步右下角,推荐本文,谢谢大家的点赞,因为您的支持是我最大动力

posted @ 2017-08-12 22:44 shinly_tong 阅读(...) 评论(...) 编辑 收藏