zoukankan      html  css  js  c++  java
  • Autofac的使用

    Autofac的使用

    1. Autofac简介
    2. 基本的使用方式
    3. 如何实现webapi控制器自动注入接口

    一、Autofac简介

    Autofac是实现依赖注入的类库之一,他可以帮助你实现程序的解耦,所谓 “上层模块不应依赖于底层模块,应当依赖于抽象,而不应依赖于细节”,哈哈,咱们说点白话吧,意思就是说 顶层的模块不应直接依赖于底层模块以及具体的实现,应当有个抽象层在中间,只知道有什么方法就行, 具体怎么实现,细节不管,这样的好处在于解耦,顶层模块通过接口得到对应实现,不在乎到底是哪个具体对象,只要有这个方法就可以(接口嘛),可以任意更换接口对应实现,而不需要修改代码。

    二、基本使用

    • 使用方式如下

    首先打开NuGet获取Autofac.Integration.WebApi,获取了之后,引用中会多出如下两个dll库

    1. Autofac.dll(这个非常重要,主要使用它)
    2. Autofac.Integration.WebApi.dll(这个在实现WebApi自动注入时需要)

    项目中引入了Autofac的dll库后,我们就可以开始正式使用Autofac了

    基础使用
    //创建IOC容器构建对象
    var builder = new ContainerBuilder();
    
    //注册接口与具体实现的对应            
    builder.RegisterType<SqlDatabase>().As<IDataBase>();
    
    //创建容器——此时的容器中已有如上注册的映射关系
    var container = builder.Build();
    
    //通过容器注入接口,得到之前注册的具体实现
    var db = container.Resolve<IDataBase>();
    
    一个接口对应多个实现的使用
    //创建IOC容器构建对象
    var builder = new ContainerBuilder();
    
    //注册同一接口对应多个实现,通过Named方法解决,加入关键字            
    builder.RegisterType<SqlDatabase>().Named<IDataBase>("sql");
    builder.RegisterType<OracleDatabase>().Named<IDataBase>("oracle");
    
    //创建容器——此时的容器中已有如上注册的映射关系
    var container = builder.Build();
    
    //通过容器注入接口+关键字,得到之前注册的具体实现
    var dbSQL = container.ResolveNamed<IDataBase>("sql");
    var dbOracle = container.ResolveNamed<IDataBase>("oracle");
    

    WebApi中,使用Autofac自动注入控制器

    跟Unity有所不同,Unity只要创建了正确的容器,在Application_Start中配置一下即可,Unity设置方式如下所示:

    //实例化容器,并注册接口对应的资源类
    var container = new UnityContainer();
    container.RegisterType<IProductRepository, ProductRepository>();
    //设置依赖
    config.DependencyResolver = new UnityDependencyResolver(container)
    

    到此,发起Webapi请求时,webapi控制器中的接口就会被注入

    Autofac的webapi接口自动注入

    废话不多说,很简单,如下所示:

    //创建容器构建对象
    var builder = new ContainerBuilder();
                
    //注册接口与实现的对应
    builder.RegisterType<SqlDatabase>().Named<IDataBase>("sql");
    builder.RegisterType<OracleDatabase>().Named<IDataBase>("oracle");
    
    //这点非常重要:将所有程序集加载进来
    Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
    //然后调用方法,将程序集中的所有webapi控制器注册到构建对象
    builder.RegisterApiControllers(assemblies).PropertiesAutowired();
    
    //创建容器——此时的容器中已有如上的注册映射关系,以及所有程序集中的webapi控制器的注册
    var container = builder.Build();
    
    //设置给依赖关系解析程序
    GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    

    此时,WebApi控制器已经可以自动注入接口 Autofac不需要给属性设置Dependency特性,就可自动实现注入

  • 相关阅读:
    MySQL 中事务的实现
    Spring Boot 生成接口文档 swagger2
    一些开源项目
    LTP随笔——本地调用ltp之ltp4j
    Linux随笔之——./configure、make、make install(转)
    Linux笔记之——Linux关机命令详解(转)
    Ubuntu杂记之——JDK、ANT安装、配置
    Android随笔之——Android ADB详解
    Android APK签名
    Android随笔之——跨进程通信(一) Activity篇
  • 原文地址:https://www.cnblogs.com/shuitao/p/13695549.html
Copyright © 2011-2022 走看看