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

时间:2024-07-06 20:35:44

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

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

一、注册autofac配置

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

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

二、bootstraper开始注册服务

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

有三种:

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

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

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

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

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

三、自定义Autofac控制器工厂

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

 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, controllerType);
} return ContainerManager.Resolve(controllerType) as IController;
}

demo:http://tonyblogs.top/

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

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