ASP.NET MVC IOC 之 Autofac(一)
新建一个MVC项目,如 AutoFacTest,引用autofac,如下图:
接下来就是开始进行编程了
首先,新建一个类库,名为 AutoFacTest.Service,该类库编写服务层代码,我们的接口和实现就都放在服务层
新建一个IStudentService.cs 接口,具体代码如下:
namespace AutoFacTest.Service
{
public interface IStudentService
{
int GetStudentAge(string name);
}
}
接着,新建一个实现类 StudentService.cs ,继承IStudentService,如下:
namespace AutoFacTest.Service.impl
{
public class StudentService:IStudentService
{
public int GetStudentAge(string name)
{
int age = ;
switch (name)
{
case "张三":
age = ;break;
case "李四":
age = ;break; }
return age;
}
}
}
定义了一个方法,根据姓名获取年龄。
服务层准备好了,接下来就是开始做注入工作了。
打开Global.cs 文件
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
AutoFacRegister(); //注入
} private void AutoFacRegister()
{
var builder = new ContainerBuilder();
//注册MVC控制器(注册所有到控制器,控制器注入,就是需要在控制器的构造函数中接收对象)
builder.RegisterControllers(typeof(MvcApplication).Assembly);
/*接口实现,构造函数注入,对StudentService与接口进行注入*/
builder.RegisterType<StudentService>().As<IStudentService>(); //设置依赖解析器
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
至此,完成第一步的注入。此方式为构造函数注入的方式。
接下来就是见证结果的时刻了,我们来看看控制器里面怎么弄。
新建一个控制器 Home,上控制器代码。
public class HomeController : Controller
{
public IStudentService Stu; //定义全局的学生抽象类对象
/// <summary>
/// 通过构造函数进行注入,注意,参数是抽象类,非实现类。因为已经在global中将实现类映射给了抽象类
/// </summary>
/// <param name="stu"></param>
public HomeController(IStudentService stu)
{
this.Stu = stu;
}
// GET: Home
public void Index()
{
Response.Write("学生类:"+ Stu.GetStudentAge("张三")+"<br />");
}
}
至此,完成处理,接下来,我们就访问 index,看是否能放回张三的年龄。
我们可以发现,返回了张三的年龄。说明我们注入成功了。
总结:
1、采用的是构造函数注入的方式,在构造函数中初始化赋值。
2、Stu对象不需要实例化,即不需要new。降低了系统资源的消耗。
3、需要在global中对StudentService写映射,如果服务类比较多的时候,就需要写很多,如何避免,这个在后面章节讲解。
扩展: 上面讲解了 构造函数注入的方式,下面扩展属性注入的方式。
在global.cs中稍微修改下注入语句即可。
将:
builder.RegisterControllers(typeof(MvcApplication).Assembly);
改为:
builder.RegisterControllers(typeof (MvcApplication).Assembly).PropertiesAutowired();
PropertiesAutowired:即,表示允许属性注入。 接下来我们来看怎么使用。
public class HomeController : Controller
{
public IStudentService Stu { get; set; } //定义全局的学生抽象类对象
/// <summary>
/// 通过构造函数进行注入,注意,参数是抽象类,非实现类。因为已经在global中将实现类映射给了抽象类
/// </summary>
// GET: Home
public void Index()
{
Response.Write("学生类:"+ Stu.GetStudentAge("张三")+"<br />");
}
}
控制器里面写的代码就简单很多了。
注意:Stu必须定义为public类型,否则将映射失败。
ASP.NET MVC IOC 之 Autofac(一)的更多相关文章
- ASP.NET MVC IOC 之AutoFac
ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...
- [转]ASP.NET MVC IOC 之AutoFac攻略
本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...
- ASP.NET MVC IOC 之AutoFac攻略
一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...
- ASP.NET MVC IOC 之 Autofac 系列开篇
本系列主要讲述Autofac在.NET MVC项目以及webform中的使用. autofac为IOC组件,实现控制反转,主要结合面向接口编程,完成较大程度的解耦工作. 作为初学者,将学习到的每一步, ...
- ASP.NET MVC IOC 之 Autofac(三)-webform中应用
在webform中应用autofac,只有global中的写法不一样,其他使用方式都一样 nuget上引用: global中的写法: private void AutoFacRegister() { ...
- ASP.NET MVC IOC 之 Autofac(二)
在上一章节,我们已经知道了再控制器中如何注入以及使用了.这一章,我们重点讲解下,如何在服务层中使用. 我们新定义一个教师类,在服务层中,通过这个教师类服务层,获取学生的年龄.实现在教师类的服务层中调用 ...
- ASP.NET MVC IOC依赖注入之Autofac系列(二)- WebForm当中应用
上一章主要介绍了Autofac在MVC当中的具体应用,本章将继续简单的介绍下Autofac在普通的WebForm当中的使用. PS:目前本人还不知道WebForm页面的构造函数要如何注入,以下在Web ...
- Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac
经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...
- ASP.NET没有魔法——ASP.NET MVC IoC
之前的文章介绍了MVC如何通过ControllerFactory及ControllerActivator创建Controller,而Controller又是如何通过ControllerBase这个模板 ...
随机推荐
- ansible执行带有环境变量的脚本不生效
1背景 jenkins发布时,使用ansible执行远程主机上的启动tomcat脚本发现不生效,启动tomcat的脚本中有环境变量. ansible主机为:172.16.35.8 tomcat服务器为 ...
- IT兄弟连 HTML5教程 HTML5表单 多样的输入类型2
4 range range类型用于包含一定范围内数字值的输入域,跟number一样,我们还可以对数值设置限定,range类型显示为滑动条用法如下: 上述代码使用了range类型输入框,为该类型设置了 ...
- excel中添加下拉候选
这里简单记录下如何在Excel2013中添加下拉候选. 首先有个思路是,下拉候选也就意味着数据被限制在一个范围之内,因此应该联想到数据验证相关的设置. 选中单列或单元格,在[数据]下的[数据验证]中选 ...
- 深入理解 Java 数组
- 计算机组成原理——DMA存取方式
DMA(Direct Memory Access)直接存储器存取 高速大容量存储器和主存之间交换时,若采用程序直接传送或程序中断传送的方式,则会有如下问题发生. 1)采用程序直接传送,主机工作效 ...
- DataTable实现分组
有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下: using System; using System.Collections.Gen ...
- sql server 2014 卸载
遇到一个沙雕工程人员~二话不装给我装了2014的版本,实际开发的时候用的是2012....欸~ 1.打开服务 2.打开控制面板下的程序与功能 3选中红框点击卸载与更改----->选择删除 4.然 ...
- PlayJava Day015
今日所学: /* 2019.08.19开始学习,此为补档. */ StringBuffer 定义: 可变字符序列 - 线程安全的 作用:基本与String相同,也是用于描述字符串 与String的区别 ...
- Oracle数据库之第四篇
/* 授权命令 grant 权限 to 用户 授权可以授予多个权限 grant connect,resource to baidu 收回权限 revoke 权限 from 用户 revoke dba ...
- pymysql连接
import pymysql conn=pymysql.connect(host='localhost',user='root',password='123',db='sg',charset='utf ...