参考博文

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. GitHub 上 1.3k Star 的 strman-java 项目有值得学习的地方吗?源码视角

    大家好,我是沉默王二. 很多初学编程的同学,经常给我吐槽,说:"二哥,你在敲代码的时候会不会有这样一种感觉,写着写着看不下去了,觉得自己写出来的代码就好像屎一样?" 这里我必须得说 ...

  2. 记一次用python 的ConfigParser读取配置文件编码报错

    记一次用python 的ConfigParser读取配置文件编码报错 ...... raise MissingSectionHeaderError(fpname, lineno, line)Confi ...

  3. crash安装使用

     cash作为Linux内核调试的工具是必不可少少的一部分,但是他的下载并不是 yum install一下这么简单的,本文就来讲一下如何安装crash进行调试.  首先就是了解Linux的内核版本.这 ...

  4. 2020.10.17 JZOJ 提高B组T2 导弹拦截

    2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ...

  5. JZOJ8月5日提高组反思

    JZOJ8月5日提高组反思 再次炸了 虽然不是爆0 但也没差多少-- T1 想的DP 然后就打了 一开始是只能拿60的 后来想到了用前缀和优化 然后打完交了 最后一分钟测了一下空间 爆了 就赶紧把数组 ...

  6. Feign 超时设置

    问题描述 微服务之间使用 Feign 调用,偶发超时问题,配置如下: feign: client: config: default: connectTimeout: 10000 readTimeout ...

  7. 4.深入Istio源码:Pilot的Discovery Server如何执行xDS异步分发

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的Istio源码是 release 1.5. 介绍 Discovery Serv ...

  8. Docker实战 | 第四篇:Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结

    一. 前言 在之前的文章中 IDEA集成Docker插件实现一键自动打包部署微服务项目,其中开放了服务器2375端口监听,此做法却引发出来一个安全问题,在上篇文章评论也有好心的童鞋提示,但自己心存侥幸 ...

  9. PyQt学习随笔:Model/View设计中支持View中展示数据的排序

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在model/view架构中,有两种方法可以实现排序,选择哪种方法依赖于底层Model.如果mode ...

  10. Error: Cannot find module '../lib/utils/unsupported.js'

    报错: nodejs : Error: Cannot find module '../lib/utils/unsupported.js' 解决办法(linux): 去node目录下:/node***/ ...