使用AutoFac实现依赖注入
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实现依赖注入的更多相关文章
- NopCommerce使用Autofac实现依赖注入
NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...
- Autofac之依赖注入
这里主要学习一下Autofac的依赖注入方式 默认构造函数注入 class A { public B _b; public A() { } public A(B b) { this._b = b; } ...
- Web API(六):使用Autofac实现依赖注入
在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入. 一.创建实体类库 1.创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: us ...
- NET Core源代码通过Autofac实现依赖注入
查看.NET Core源代码通过Autofac实现依赖注入到Controller属性 阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...
- 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性
一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
- WebAPi使用Autofac实现依赖注入
WebAPi依赖注入 使用记录 笔记 1.NuGet包安装 2.控制器加入构造函数 3.Global.asax ----Application_Start 应用程序启动时 using Autofa ...
- Autofac 泛型依赖注入
using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...
- 五:.net core(.NET 6)使用Autofac实现依赖注入
Autofac的简单使用: 由于将来可能引用很多包,为了保持统一队形,我们再新建一个类库项目Wsk.Core.Package,当做包的引用集合: 删掉Class1,把Wsk.Core.Wsk.Core ...
- 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法
之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...
随机推荐
- 使用jQuery插件时避免重复引入jquery.js文件
当一个页面使用多个jQuery插件时,需要避免重复引入jquery.js文件,因为后面映入的jQuery.js文件中定义的jQuery对象会覆盖掉前面的jQuery对象,导致之前定义的jQuery插件 ...
- getaddrinfo函数
一.功能 对于IPv4和IPv6均适用,可以处理名字到地址以及服务到端口这两种变换,返回的是一个sockaddr结构而不是一个地址队列 二.函数原型 #include <netdb.h> ...
- termios结构体各成员的值(FreeBSD 12.0)
一.文件位置 /usr/include/sys/_termios.h 二.文件内容 /*- * SPDX-License-Identifier: BSD-3-Clause * * Copyright ...
- httpd.conf文件与.htaccess文件的对比
httpd.conf文件与.htaccess文件相比,Apache对两者的mod_rewrite规则在处理方法上有些细微的差别.在实 际运行时,如果有任何原因使得倾向于使用httpd.conf,都需要 ...
- sql插入oracle链接的数据
报错OLE DB 访问接口 "OraOLEDB.Oracle" 返回了消息 "ORA-29275: 部分多字节字符". select addr from tes ...
- oracle 重建索引以及导出所有的索引脚本(可以解决还原数据库文件时先还原数据,在重新用脚本创建索引)
导出数据库备份文件 1. 备份服务器数据,采用并行方式,加快备份速度(文件日期根据具体操作日期修改) expdp jhpt/XXXX directory=databackup dumpfile=dpf ...
- Frameset 框架
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.c ...
- Vue中splice的使用
转载:https://blog.csdn.net/xiha_zhu/article/details/80449339 splice(index,len,[item])它也可以用来替换/删除/添加数组内 ...
- [C++]PAT乙级1009. 说反话 (17/20)
/* 1009. 说反话 (20) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例, 在一行内给出总长度不超过80的字符串. 字符串由若干单词和若干 ...
- MacOS安装Go2Shell
1 去官网下载安装MacOS最新版本 https://zipzapmac.com/Go2Shell 2 下一步下一步安装 3 设置 打开终端设置, open -a Go2Shell --args co ...