1.基本使用

1.1新建MVC项目并安装Autofac

注意需要安装AutoFac和AutoFac.mvc5

 Install-Package Autofac

 Install-Package Autofac.Mvc5 -Version 

安装后的项目如图所示:

1.2.添加类库,用于接口及实现

为了区分Test和TestSec,在返回的日期格式做了处理。

1.3在Global.asax文件中完成接口的注册

AutoFac注册方法:

         private void AutoFacRegister()
         {
             var builder = new ContainerBuilder();
             //注册MVC控制器(注册所有到控制器)
             builder.RegisterControllers(typeof(MvcApplication).Assembly);
             //可选,注册模型绑定
             //builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
             //builder.RegisterModelBinderProvider();
             //可选,注册web抽象层例如HttpContextBase
             //builder.RegisterModule<AutofacWebTypesModule>();
             //可选,启用视图页属性注入
             //builder.RegisterSource(new ViewRegistrationSource());
             //可选,启用方法参数注入
             //builder.InjectActionInvoker();

             /*接口实现*/
             builder.RegisterType<Test>().As<ITest>();
             builder.RegisterType<TestSec>().As<ITestSec>();
             //设置依赖解析器
             var container = builder.Build();
             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
         }

将AutoFac加入代码启动程序:

         protected void Application_Start()
         {
             AreaRegistration.RegisterAllAreas();
             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
             RouteConfig.RegisterRoutes(RouteTable.Routes);
             BundleConfig.RegisterBundles(BundleTable.Bundles);

             AutoFacRegister();
         }

1.4新建TestController控制器,进行测试

在控制器的构造函数中初始化接口:

         private ITest test;
         private ITestSec testSec;
         public TestController(ITest test,ITestSec testSec)
         {
             this.test = test;
             this.testSec = testSec;
         }

添加接口用于测试:

         public JsonResult GetTest()
         {
             dynamic result=new {
                 Time1=test.GetDateTime(),
                 Time2=testSec.GetDateTime()
             };
             return this.Json(result, JsonRequestBehavior.AllowGet);
         }

注意黄色背景文字,设置为可通过get方式获取,否则地址栏直接访问会报错

1.5测试结果

2.代码优化

刚才的 ITest 和 ITestSec 两个接口均在TestController控制器的构造函数中注入,但是如果所有的接口都放在这里的话,那控制器中的构造函数可能会非常的乱。想想一个项目几十个接口,每个接口还可能复用了其他接口,并且调用时还需要接口向下传递,所以刚才的写法并不优雅。

在02AutoFac.Application中新建 IComonService 接口:

     public interface IComonService
     {
         dynamic GetTest();
     }

通过 ICommonService 调用ITest和ITestSec接口,实现如下:

     public class CommonService:IComonService
     {
         private ITest test;
         private ITestSec testSec;
         public CommonService(ITest test,ITestSec testSec)
         {
             this.test = test;
             this.testSec = testSec;
         }
         public dynamic GetTest()
         {
             dynamic result = new
             {
                 Time1=test.GetDateTime(),
                 Time2=testSec.GetDateTime()
             };
             return result;
         }
     }

如此ITest和ITestSec两个接口变注入到CommonService方法中,修改控制器如下:

         private IComonService commonService;
         public TestController(IComonService commonService)//(ITest test,ITestSec testSec)
         {
             this.commonService = commonService;
         }
         public JsonResult GetTest()
         {
             dynamic result = commonService.GetTest();
             return Json(result, JsonRequestBehavior.AllowGet);
         }

注意修改 Global.asax 中的注入程序:

         private void AutoFacRegister()
         {
             var builder = new ContainerBuilder();
             //注册MVC控制器(注册所有到控制器)
             builder.RegisterControllers(typeof(MvcApplication).Assembly);
             //可选,注册模型绑定
             //builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
             //builder.RegisterModelBinderProvider();
             //可选,注册web抽象层例如HttpContextBase
             //builder.RegisterModule<AutofacWebTypesModule>();
             //可选,启用视图页属性注入
             //builder.RegisterSource(new ViewRegistrationSource());
             //可选,启用方法参数注入
             //builder.InjectActionInvoker();

             /*接口实现*/
             builder.RegisterType<Test>().As<ITest>();
             builder.RegisterType<TestSec>().As<ITestSec>();
             builder.RegisterType<CommonService>().As<IComonService>();
             //设置依赖解析器
             var container = builder.Build();
             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
         }

3.消灭构造函数

上述两种方法已经能实现基本的注入,但是当一个接口依赖于过多的子接口时,构造函数会变的异常的庞大。最关键的是,上述只适用于接口传递,如果对于某个需要实例化的类中调用某个接口,则无法实现(才疏学浅,此处不对还望指出)

通过将container写为全局解决,注意此时的TestService类的构造函数已经无参

 namespace _02AutoFac.Application
 {
     public class TestService
     {
         ITest test;
         ITestSec testSec;
         public TestService()
         {
             test = AutoFacHelper.GetService<ITest>();
             testSec = AutoFacHelper.GetService<ITestSec>();
         }
         public dynamic GetTest()
         {
             dynamic result = new
             {
                 time1=test.GetDateTime(),
                 time2=testSec.GetDateTime()
             };
             return result;
         }
     }
 }

控制器调用实例化的方法:

         public JsonResult GetTest()
         {
             TestService service = new TestService();
             dynamic result = service.GetTest();
             return Json(result, JsonRequestBehavior.AllowGet);
         }

新增的AutoFacHelper方法:

     public class AutoFacHelper
     {
         private static IContainer container;

         public static void InitAutoFac()
         {
             var builder = new ContainerBuilder();
             //注册MVC控制器(注册所有到控制器)
             builder.RegisterControllers(typeof(MvcApplication).Assembly);
             //可选,注册模型绑定
             //builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
             //builder.RegisterModelBinderProvider();
             //可选,注册web抽象层例如HttpContextBase
             //builder.RegisterModule<AutofacWebTypesModule>();
             //可选,启用视图页属性注入
             //builder.RegisterSource(new ViewRegistrationSource());
             //可选,启用方法参数注入
             //builder.InjectActionInvoker();

             /*接口实现*/
             builder.RegisterType<Test>().As<ITest>();
             builder.RegisterType<TestSec>().As<ITestSec>();
             builder.RegisterType<CommonService>().As<IComonService>();
             //设置依赖解析器
             container = builder.Build();
             DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

         }
         public static T GetService<T>()
         {
             T t = container.Resolve<T>();
             return t;
         }
     }

代码地址

https://github.com/imstrive/ConsoleTest/tree/master/02AutoFacTest

使用AutoFac实现依赖注入的更多相关文章

  1. NopCommerce使用Autofac实现依赖注入

    NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...

  2. Autofac之依赖注入

    这里主要学习一下Autofac的依赖注入方式 默认构造函数注入 class A { public B _b; public A() { } public A(B b) { this._b = b; } ...

  3. Web API(六):使用Autofac实现依赖注入

    在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入. 一.创建实体类库 1.创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: us ...

  4. NET Core源代码通过Autofac实现依赖注入

    查看.NET Core源代码通过Autofac实现依赖注入到Controller属性   阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...

  5. 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性

    一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...

  6. 【AutoFac】依赖注入和控制反转的使用

    在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...

  7. WebAPi使用Autofac实现依赖注入

    WebAPi依赖注入  使用记录 笔记 1.NuGet包安装 2.控制器加入构造函数 3.Global.asax  ----Application_Start 应用程序启动时 using Autofa ...

  8. Autofac 泛型依赖注入

    using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...

  9. 五:.net core(.NET 6)使用Autofac实现依赖注入

    Autofac的简单使用: 由于将来可能引用很多包,为了保持统一队形,我们再新建一个类库项目Wsk.Core.Package,当做包的引用集合: 删掉Class1,把Wsk.Core.Wsk.Core ...

  10. 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法

    之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...

随机推荐

  1. Nginx 学习笔记(六)引入线程池 性能提升9倍

    原文地址:https://www.cnblogs.com/shitoufengkuang/p/4910333.html 一.前言 1.Nignx版本:1.7.11 以上 2.NGINX采用了异步.事件 ...

  2. Android GreenDao使用教程

    1.在build.gradle里添加相关依赖 apply plugin: 'org.greenrobot.greendao' buildscript { repositories { mavenCen ...

  3. GCC编译器原理(二)------编译原理一:ELF文件(1)

    二.ELF 文件介绍 2.1 可执行文件格式综述 相对于其它文件类型,可执行文件可能是一个操作系统中最重要的文件类型,因为它们是完成操作的真正执行者.可执行文件的大小.运行速度.资源占用情况以及可扩展 ...

  4. 利用PHP连接数据库——实现用户登录注册功能以及管理员对用户注册的审核功能

    1.用户注册页面 页面效果: 代码如下: <!DOCTYPE html><html>    <head>        <meta charset=" ...

  5. python 的基础 学习 第七天 is id 编码的补充

    1,== 两个等号比较的是数值,is比较的是内存地址.print(id())查看的内存地址. 小数据池只存在于数字与字符串中,数字   是 -5^^256,是为了节省空间. 字符串1,如果含有特殊字符 ...

  6. python3:实现输出等边三角形、直角三角形

    学习python,用的是3.5的版本: 记录一下学习历程~ 一.先来一个简单的,输出直角三角形: ***知识点:for循环,range()函数 二.进阶:输出等边三角形 ******知识点:嵌套for ...

  7. Eclipse安装lombok及常用注解

    转自:https://blog.csdn.net/ZJDWHD/article/details/77795023 lombok的官方网址:http://projectlombok.org/ https ...

  8. 高程小tips

    1.DOM操作往往是JS程序中开销最大的部分,应尽量减少DOM操作.-P285  P297例子 2.元素的classList属性: 元素的classLis即该元素的class的值的集合,是一个列表(数 ...

  9. vue WepApp 音乐App实战以及各个知识点

    1.组件初始化(scoped 貌似属于局域css样式) 2.组件使用三部曲(当然第三步可以<MHeader></MHeader> 也不报错) 3. 配置 路由 ①.在route ...

  10. Css - 利于搜索引擎收录的三个标签

    Css - 利于搜索引擎收录的三个标签 <head> <meta charset="utf-8" /> <title>京东(JD.COM)-正品 ...