IoC之AutoFac(四)——AutoFac在MVC中的使用
阅读目录
Mvc中使用Autofac
前面学习了AutoFac的注册、解析、生命周期,这里写一个AutoFac在ASP.NET MVC中的简单使用。
基本结构:AutoFacMvc作为ui层 ,IService类库(各种服务接口),Service类库(IService中接口的实现),Model类库(数据模型,这里使用EF)
我们的目的:实现MVC中的Controller和Service中的具体实现类解耦
获取用户列表的简单例子:
IService中的接口:

- namespace IService
- {
- public interface IUserInfoService
- {
- List<UserInfo> GetUsers();
- }
- }

Service中的实现:

- namespace Service
- {
- public class UserInfoService : IUserInfoService
- {
- //获取用户列表
- public List<Model.UserInfo> GetUsers()
- {
- DbContext context = DbFactory.GetDbContext();
- return context.Set<UserInfo>().ToList<UserInfo>();
- }
- }
- }

第一步:在mvc中添加dll文件,可以通过Nuget直接添加
第二步:在App_Start文件夹中添加一个AutofacConfig类

- 1 public class AutofacConfig
- 2 {
- 3 /// <summary>
- 4 /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
- 5 /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
- 6 /// </summary>
- 7 public static void Register()
- 8 {
- 9 //实例化一个autofac的创建容器
- 10 var builder = new ContainerBuilder();
- 11 //告诉Autofac框架,将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo)
- 12 Assembly controllerAss = Assembly.Load("AutoFacMvcDemo");
- 13 builder.RegisterControllers(controllerAss);
- 14
- 15 //如果有Dal层的话,注册Dal层的组件
- 16 //告诉autofac框架注册数据仓储层所在程序集中的所有类的对象实例
- 17 //Assembly dalAss = Assembly.Load("Dal");
- 18 //创建respAss中的所有类的instance以此类的实现接口存储
- 19 //builder.RegisterTypes(dalAss.GetTypes()).AsImplementedInterfaces();
- 20
- 21 //告诉autofac框架注册业务逻辑层所在程序集中的所有类的对象实例
- 22 Assembly serviceAss = Assembly.Load("Service");
- 23 //创建serAss中的所有类的instance以此类的实现接口存储
- 24 builder.RegisterTypes(serviceAss.GetTypes()).AsImplementedInterfaces();
- 25
- 26
- 27 //创建一个Autofac的容器
- 28 var container = builder.Build();
- 29 //将MVC的控制器对象实例 交由autofac来创建
- 30 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
- 31 }
- 32 }

第三步:在Global.asax调用AutofacConfig类中的Register方法,注册组件

- 1 public class MvcApplication : System.Web.HttpApplication
- 2 {
- 3 protected void Application_Start()
- 4 {
- 5 AreaRegistration.RegisterAllAreas();
- 6 RouteConfig.RegisterRoutes(RouteTable.Routes);
- 7 //注册组件
- 8 AutofacConfig.Register();
- 9 }
- 10 }

第四步:简单测试
- UserInfoController :

- 1 namespace AutoFacMvcDemo.Controllers
- 2 {
- 3 public class UserInfoController : Controller
- 4 {
- 5 private IUserInfoService userinfoService;
- 6 //通过构造器注入依赖
- 7 public UserInfoController(IUserInfoService _userinfoService)
- 8 {
- 9 userinfoService = _userinfoService;
- 10 }
- 11
- 12 public ActionResult Index()
- 13 {
- 14 //不使用autofac时,service层和mvc ui层强耦合
- 15 //UserInfoService userInfoService = new UserInfoService();
- 16 //List<UserInfo> users= userInfoService.GetUsers();
- 17
- 18 List<UserInfo> users= userinfoService.GetUsers();
- 19 ViewBag.users = users;
- 20 return View();
- 21 }
- 22 }
- 23 }

View

- @{
- ViewBag.Title = "Index";
- }
- <h2>用户列表</h2>
- @* 简单展示用户 *@
- <table>
- @foreach (var item in ViewBag.users)
- {
- <tr>
- <td>@item.UId</td>
- <td>@item.UserName</td>
- <td>@item.Age</td>
- </tr>
- }
- </table>

运行结果:
补充:可以逐个进行注册代码如下,在Application_Start方法中添加如下代码 :

- //创建autofac管理注册类的容器实例
- var builder = new ContainerBuilder();
- //注册组件(注意:在注册时添加了UserInfoService的引用,其实还是耦合的,在不分层的项目中好用)
- builder.RegisterType<UserInfoService>().As<IUserInfoService>();
- //使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
- builder.RegisterControllers(Assembly.GetExecutingAssembly());
- //生成具体的实例
- var container = builder.Build();
- //下面就是使用MVC的扩展 更改了MVC中的注入方式.
- DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

IoC之AutoFac(四)——AutoFac在MVC中的使用的更多相关文章
- 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法
一. 简介 MVC中的过滤器可以说是MVC框架中的一种灵魂所在,它是MVC框架中AOP思想的具体体现,所以它以面向切面的形式无侵入式的作用于代码的业务逻辑,与业务逻辑代码分离,一经推出,广受开发者的喜 ...
- YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由
上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引 ...
- 玩转spring mvc(四)---在spring MVC中整合JPA
关于在Spring MVC中整合JPA是在我的上一篇关于spring mvc基本配置基础上进行的,所以大家先参考一下我的上一篇文章:http://blog.csdn.net/u012116457/ar ...
- IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用
Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- IOC容器-Autofac在MVC中实现json方式注入使用
在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...
- Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac
经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...
- ASP.NET MVC中简单使用Autofac
项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IPro ...
随机推荐
- HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)
<题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...
- HDU6397
HDU6397用小于n的m个数组成k,求方案数mod 998244353如果没有n的限制,直接用隔板法求就可以因为m个数中可以为0,所以不妨先都放上一个1,转化成不能为0的m个数来凑k+m,即C(k+ ...
- 001.Oracle安装部署-本地文件系统
一 环境准备 安装包:linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 二 安装Oracle准备 2.1 用户名/ ...
- 记录下这几天使用 GitHub 碰到的问题
1.在 GitHub 上为新项目创建一个库时,默认是不使能主页功能的 如果你想要使用 GitHub 的主页功能做一个博客或一份简历,需要人为设置一下.如下图: 制作简历,这里有一份更详细的参考:如何在 ...
- 解决SpringBoot的@Autowired无法注入问题
问题:@Autowired无法自动注入 思路:SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!"Application类"是指 ...
- BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...
- python基础一 ------如何获取多个字典相同的键
需求: 足球赛第一场进去统计 {"A":3,"B":2,"C":1}足球赛第二场进去统计 {"A":3," ...
- 潭州课堂25班:Ph201805201 django 项目 第二十五课 文章多级评论前后台实现 (课堂笔记)
添加新闻评论功能 1.分析 业务处理流程: 判断前端传的新闻id是否为空,是否为整数.是否不存在 判断评论的内容是否为空 判断是否有父评论,父评论的id是否与新闻id匹配 判断用户是否登录 保存新闻评 ...
- Lubuntu安装屏幕键盘onboard,使触摸屏可以登录和输入
Lubuntu18.04 LTS桌面使用 LightDM 显示管理器,默认已经安装了GTK+ 欢迎界面 需要的话可以下列命令安装使用 $ sudo apt-get install lightdm-gt ...
- C++程序设计方法6:算法横向拆分
例子1:负载监视器,如何在一个程序中实现对这些不同条件的适应呢? int main() { WindowDisplay display; Monitor monitor(&display); ...