MVC中Autofac的使用
参考博文
https://www.cnblogs.com/liupeng/p/4806184.html
https://blog.csdn.net/qq_37214567/article/details/78227628?locationnum=2&fps=1
引用
第一个为Autofac
第二个为Autofac的MVC扩展

项目结构
测试使用的表名称为SysSample,图中2-6为其BLL、DAL、IBLL、IDAL、Models 项目

关系

使用
构造函数注入
(1)自动注入。BLL、Controller 均是由Autofac统一注入
a.创建一个 统一被继承的接口,IDependency

b.引用。BLL、IBLL、DAL、IDAL 四个项目均引用IDependency所在的Apps.AutofacBase项目。
c.继承.。ISysSampleBLL和ISysSampleRepository均继承此接口

d.构造函数。SysSampleBLL和SysSampleController构造函数修改。

e.Web项目的引用。Web需要添加对BLL、IBLL、DAL、IDAL四个项目的引用。否则自动注入时,缺少未引用项目的注入信息。
f.Application_Start()方法的修改

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Apps.AutofacBase;
using Apps.BLL;
using Apps.DAL;
using Apps.IBLL;
using Apps.IDAL;
using Autofac;
using Autofac.Integration.Mvc; namespace Apps.Web
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); //启用jscss压缩
BundleTable.EnableOptimizations = true;
BundleConfig.RegisterBundles(BundleTable.Bundles); #region 自动注入 //创建autofac管理注册类的容器实例
var builder = new ContainerBuilder();
Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
//注册所有实现了 IDependency 接口的类型
Type baseType = typeof(IDependency);
builder.RegisterAssemblyTypes(assemblies)
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
.AsSelf().AsImplementedInterfaces()
.PropertiesAutowired().InstancePerLifetimeScope(); //注册MVC类型
builder.RegisterControllers(assemblies).PropertiesAutowired();
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
#endregion }
}
}
(2)手动注入
无需创建IDependency接口。
需要将所有需要注入的类、接口、调用者一一列出。
Application_Start()方法的修改

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Apps.AutofacBase;
using Apps.BLL;
using Apps.DAL;
using Apps.IBLL;
using Apps.IDAL;
using Apps.Web.Controllers;
using Autofac;
using Autofac.Integration.Mvc; namespace Apps.Web
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes); //启用jscss压缩
BundleTable.EnableOptimizations = true;
BundleConfig.RegisterBundles(BundleTable.Bundles); #region 手动注入 //创建autofac管理注册类的容器实例
var builder = new ContainerBuilder(); /*需要进行依赖注入的IBLL*/
//类和接口的关系
builder.RegisterType<SysSampleRepository>().As<ISysSampleRepository>();
builder.RegisterType<SysSampleBLL>().As<ISysSampleBLL>(); //调用者的注入。
builder.RegisterType<SysSampleBLL>().InstancePerDependency();//SysSampleBLL中调用了DAL层 //(不推荐)单个Controller控制器注册
builder.RegisterType<SysSampleController>().InstancePerDependency();//SysSampleController调用的BLL层 //(推荐写法)使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册
//builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
//生成具体的实例
var container = builder.Build();
//下面就是使用MVC的扩展 更改了MVC中的注入方式.
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion }
}
}
属性注入
(1)自动注入。
a.与1.(1) 构造函数注入的自动注入 配置,大部分一致,
b.需要修改的地方。注入调用者时,需要在最后面加上.PropertiesAutowired();

引用的对象,将构造函数修改为属性。

(2)手动注入
a.与2.(1) 同理,大部分一致
b.需要修改的地方。百度上说注入调用者时,需要在最后面加上.PropertiesAutowired();
但是在实际调用时,仍然调用失败。未进行深入研究。

备注
(1)构造函数注入修改为属性注入。主要的区别就是需要在注册调用者 后面加上.PropertiesAutowired();
(2)目前VS2012,能完全引用Autofac.dll Autofac.Configuration.dll Autofac.Integration.Mvc.dll 三个文件的版本信息,如下
Install-Package Autofac -version 3.5.2
Install-Package Autofac.Configuration -Version 3.3.0
Install-Package Autofac.Mvc5 -version 3.3.4
主要是Configuration的dll,3.3.0后面的就是4.0.0beta版本。
VS2012再引用时就会报错了,好像是因为VS2012最多只能创建.Net4.5版本的项目导致。
具体原因没有细究。
而且本人使用的项目中,因为使用了自动注入的方式,就没有再使用Configuration进行config的配置了。
(3)为书写和观看方便,本人项目当前使用的是。自动注入+属性注入。
MVC中Autofac的使用的更多相关文章
- 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, ...
- ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下
先简单了解一这个几个 名词的意思. 控制反转(IOC) 依赖注入(DI) 并不是某种技术. 而是一种思想.一种面向对象编程法则 什么是控制反转(IOC)? 什么是依赖注入(DI) 可以点击下面链接 ...
- 如何在asp.net mvc 中使用Autofac 控制反转(Ioc)
前言 最近看了一些关于Ioc方面的开源项目,里面的类跳来转去,看的迷迷糊糊的.项目里根本不需要这么“复杂的”设计,只需简单完成Ico,达到解耦的目的,并且能高效的完成项目.于是参考autofac的官网 ...
- IoC之AutoFac(四)——AutoFac在MVC中的使用
阅读目录 Mvc中使用Autofac 第一步:在mvc中添加dll文件,可以通过Nuget直接添加 第二步:在App_Start文件夹中添加一个AutofacConfig类 第三步:在Global.a ...
- AutoFac在MVC中的使用
在asp.net mvc控制器中使用Autofac来解析依赖 如下Controller中使用构造函数依赖注入接口IUserService: public IUserService _IUserServ ...
- IOC容器-Autofac在MVC中实现json方式注入使用
在你阅读时,默认已经了解IOC和autofac的基本用法, 我在最近的我的博客项目中运用了IOC autofac 实现了依赖注入 由于我的项目时asp.net MVC所以我目前向大家展示MVC中如何使 ...
- Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)
上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...
- Asp.Net Mvc使用Autofac实现依赖注入
在asp.net mvc控制器中使用Autofac来解析依赖 如下Controller中使用构造函数依赖注入接口IPeople : public class AutoFacController : C ...
- 多层架构+MVC+EF+AUTOFAC+AUTOMAPPER
最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友. 一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证 ...
随机推荐
- ESP8266 ESP-01制作B站粉丝计数器 | Arduino IDE开发ESP8266 | ESP8266存储读取用户数据
1.实物图 2.原理图 3.Arduino程序 在程序中修改自己的B站UID和自己家的WiFi名称及密码即可. /*B站粉丝计数器*/ /******************************* ...
- 编程小白必备——主流语言C语言知识点
对于编程语言来说,经常看到有因为各自支持的语言阵营而互怼的,其实根本没那个必要,都只是一种工具而已.当多数主流语言都会使用时也许你就不会有偏见了,本质不过都是用来描述计算机的一个任务,只是每门语言设计 ...
- rest-framework:认证组件
一 认证简介: 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二 局部使用 models.py class Use ...
- Python正则表达式re.match(r"(..)+", "a1b2c3")匹配结果为什么是”c3”?
在才开始学习正则表达式处理时,老猿对正则表达式:re.match(r"(-)+", "a1b2c3") 返回的匹配结果为"c3"没有理解,学 ...
- PyQt学习随笔:使用QPropertyAnimation开发简单动画
QPropertyAnimation是PyQt5.QtCore模块提供的动画设计类,使用该类可以针对PyQt的界面对象进行动画播放,如果要针对一个指定对象进行动画播放,包括如下步骤: 一.创建动画对象 ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
- 在Centos7下docker配置自动化环境镜像(python3.7+selenium 3.11+firefox 62+geckodriver 0.21)
最近在学习Docker,准备做自动化测试代码集成的功能.如下文章的前提是已经安装好linux系统,且成功安装好Docker. 接下来我会按步骤一步一步的对自动化需要的一些环境进行安装,如果没有特别说明 ...
- js监测页面是否切换到后台
最近做个弹幕,用的是第三方的插件,在浏览器页面切换到后台,返回后发现数据有堆叠卡死的情况,如何解决这个问题?网上参考了些demo,大致可以实现 1.document.hidden( Boolean值, ...
- 【题解】P6329 【模板】点分树 | 震波
题外话 (其实模板题没必要在这里水题解的--主要是想说这个qwq) 小常数的快乐.jpg 我也不知道我为啥常数特别小跑得飞快--不加快读就能在 luogu 的最优解上跑到 rank5 ( 说不定深夜提 ...
- 题解-FJOI2014 树的重心
FJOI2014 树的重心 \(Q\) 组测试数据.给一棵树大小为 \(n\),求有多少个子树与其重心相同.重心可能有多个. 数据范围:\(1\le Q\le 50\),\(1\le n\le 200 ...