参考博文

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的使用的更多相关文章

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

  2. ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下

    先简单了解一这个几个 名词的意思. 控制反转(IOC) 依赖注入(DI) 并不是某种技术. 而是一种思想.一种面向对象编程法则 什么是控制反转(IOC)?  什么是依赖注入(DI) 可以点击下面链接 ...

  3. 如何在asp.net mvc 中使用Autofac 控制反转(Ioc)

    前言 最近看了一些关于Ioc方面的开源项目,里面的类跳来转去,看的迷迷糊糊的.项目里根本不需要这么“复杂的”设计,只需简单完成Ico,达到解耦的目的,并且能高效的完成项目.于是参考autofac的官网 ...

  4. IoC之AutoFac(四)——AutoFac在MVC中的使用

    阅读目录 Mvc中使用Autofac 第一步:在mvc中添加dll文件,可以通过Nuget直接添加 第二步:在App_Start文件夹中添加一个AutofacConfig类 第三步:在Global.a ...

  5. AutoFac在MVC中的使用

    在asp.net mvc控制器中使用Autofac来解析依赖 如下Controller中使用构造函数依赖注入接口IUserService: public IUserService _IUserServ ...

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

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

  7. Entity Framework在Asp.net MVC中的实现One Context Per Request(附源码)

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...

  8. Asp.Net Mvc使用Autofac实现依赖注入

    在asp.net mvc控制器中使用Autofac来解析依赖 如下Controller中使用构造函数依赖注入接口IPeople : public class AutoFacController : C ...

  9. 多层架构+MVC+EF+AUTOFAC+AUTOMAPPER

    最近使用ligerui搭建了一个简单的教务管理demo,将重要的地方记录,也希望能帮到有这方面需要园友. 一.目录 1.多层架构+MVC+EF+AUTOFAC+AUTOMAPPER: 2.MVC中验证 ...

随机推荐

  1. python连接mysql循环插入千万条数据脚本

    之前都是在mysql的存储过程中插入数据,毕竟mysql语法函数有限,很多都有限制.突然想到学了python正好可以练练手.首先需要安装pymysql模块包(模块包安装请自行百度) pip insta ...

  2. 如何获取公网IP的mac地址

    如何获取远程IP的mac地址 思路分析 由于java本身没有相关的jar包进行获取,所以这里介绍从其他的方面进行入手和实践 使用的工具对比: tcpdump tshark pcap4j 都可以达到抓包 ...

  3. Linux下使用Docker部署nacos-server(单机模式),丧心病狂的我在半夜给UCloud提交了一份工单

    1. 拉取nacos-server镜像 进入 Docker Hub 查看nacos-server最新版本为 nacos-server:1.4.0 配置阿里云镜像加速 sudo mkdir -p /et ...

  4. fist-第五天冲刺随笔

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  5. MSSQL 2014数据库Alwayson下日志过大,压缩日志的处理方法

    USE [{数据库名称}] DECLARE @bakfile nvarchar(100) SET @bakfile='E:\DbLogs\log_bak_'+CONVERT(nvarchar(8),G ...

  6. Markdown实用教程

    Markdown 是用来编写结构化文档的一种纯文本格式,它使我们在双手不离开键盘的情况下,可以对文本进行一定程度的格式排版.markdown语法是通用的,很多写作平台都是支持markdown的,比如简 ...

  7. PyQt(Python+Qt)学习随笔:QHeaderView.ResizeMode取值及含义

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 关于ResizeMode的使用请参考<PyQt(Python+Qt)学习随笔:QTableWi ...

  8. 缩减项目代码中的大面积if策略

    参考设计模式 - 策略模式我们可以优化if-else代码段,而在Spring(Boot)中,借助ApplicationContext扫描,可以使代码更加干净. 话不多说,亮代码: 首先按照策略模式的写 ...

  9. Python中错误之 TypeError: object() takes no parameters、TypeError: this constructor takes no arguments

    TypeError: object() takes no parameters TypeError: this constructor takes no arguments 如下是学习python类时 ...

  10. 笔试题.NET基础代码面试题

    题目如下,本随笔只是记录,都是一些自身面经的题目,您既然点开了的话,学习下无妨,说不定有帮助呢 以下答案都经过博主一个个去运行过. 题目1 (实例化后 x=?;y=? 输出什么): public cl ...