阅读目录


Mvc中使用Autofac

前面学习了AutoFac的注册、解析、生命周期,这里写一个AutoFac在ASP.NET MVC中的简单使用。

基本结构:AutoFacMvc作为ui层 ,IService类库(各种服务接口),Service类库(IService中接口的实现),Model类库(数据模型,这里使用EF)

我们的目的:实现MVC中的Controller和Service中的具体实现类解耦

获取用户列表的简单例子:

IService中的接口:

  1. namespace IService
  2. {
  3. public interface IUserInfoService
  4. {
  5. List<UserInfo> GetUsers();
  6. }
  7. }

Service中的实现:

  1. namespace Service
  2. {
  3. public class UserInfoService : IUserInfoService
  4. {
  5. //获取用户列表
  6. public List<Model.UserInfo> GetUsers()
  7. {
  8. DbContext context = DbFactory.GetDbContext();
  9. return context.Set<UserInfo>().ToList<UserInfo>();
  10. }
  11. }
  12. }

第一步:在mvc中添加dll文件,可以通过Nuget直接添加

第二步:在App_Start文件夹中添加一个AutofacConfig类

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

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

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

第四步:简单测试

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

View

  1. @{
  2. ViewBag.Title = "Index";
  3. }
  4. <h2>用户列表</h2>
  5.  
  6. @* 简单展示用户 *@
  7. <table>
  8. @foreach (var item in ViewBag.users)
  9. {
  10. <tr>
  11. <td>@item.UId</td>
  12. <td>@item.UserName</td>
  13. <td>@item.Age</td>
  14. </tr>
  15. }
  16. </table>

运行结果:


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

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

IoC之AutoFac(四)——AutoFac在MVC中的使用的更多相关文章

  1. 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法

    一. 简介 MVC中的过滤器可以说是MVC框架中的一种灵魂所在,它是MVC框架中AOP思想的具体体现,所以它以面向切面的形式无侵入式的作用于代码的业务逻辑,与业务逻辑代码分离,一经推出,广受开发者的喜 ...

  2. YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

    上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引 ...

  3. 玩转spring mvc(四)---在spring MVC中整合JPA

    关于在Spring MVC中整合JPA是在我的上一篇关于spring mvc基本配置基础上进行的,所以大家先参考一下我的上一篇文章:http://blog.csdn.net/u012116457/ar ...

  4. IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用

    Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...

  5. ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用

    话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...

  6. 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, ...

  7. IOC容器-Autofac在MVC中实现json方式注入使用

    在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...

  8. Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac

    经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...

  9. ASP.NET MVC中简单使用Autofac

    项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IPro ...

随机推荐

  1. HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)

    <题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...

  2. HDU6397

    HDU6397用小于n的m个数组成k,求方案数mod 998244353如果没有n的限制,直接用隔板法求就可以因为m个数中可以为0,所以不妨先都放上一个1,转化成不能为0的m个数来凑k+m,即C(k+ ...

  3. 001.Oracle安装部署-本地文件系统

    一 环境准备 安装包:linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip 二 安装Oracle准备 2.1 用户名/ ...

  4. 记录下这几天使用 GitHub 碰到的问题

    1.在 GitHub 上为新项目创建一个库时,默认是不使能主页功能的 如果你想要使用 GitHub 的主页功能做一个博客或一份简历,需要人为设置一下.如下图: 制作简历,这里有一份更详细的参考:如何在 ...

  5. 解决SpringBoot的@Autowired无法注入问题

    问题:@Autowired无法自动注入 思路:SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!"Application类"是指 ...

  6. BZOJ.5461.[PKUWC2018]Minimax(DP 线段树合并)

    BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_ ...

  7. python基础一 ------如何获取多个字典相同的键

    需求: 足球赛第一场进去统计  {"A":3,"B":2,"C":1}足球赛第二场进去统计  {"A":3," ...

  8. 潭州课堂25班:Ph201805201 django 项目 第二十五课 文章多级评论前后台实现 (课堂笔记)

    添加新闻评论功能 1.分析 业务处理流程: 判断前端传的新闻id是否为空,是否为整数.是否不存在 判断评论的内容是否为空 判断是否有父评论,父评论的id是否与新闻id匹配 判断用户是否登录 保存新闻评 ...

  9. Lubuntu安装屏幕键盘onboard,使触摸屏可以登录和输入

    Lubuntu18.04 LTS桌面使用 LightDM 显示管理器,默认已经安装了GTK+ 欢迎界面 需要的话可以下列命令安装使用 $ sudo apt-get install lightdm-gt ...

  10. C++程序设计方法6:算法横向拆分

    例子1:负载监视器,如何在一个程序中实现对这些不同条件的适应呢? int main() { WindowDisplay display; Monitor monitor(&display); ...