AutoFac - 将 autofac 应用于MVC多层项目
一、前言
AutoFac是.NET平台下的一款著名的IoC Container,它可以让我们很轻松的解除项目中服务类的接口与客户类的接口实现类之间的依赖关系,从而降低系统各模块之间耦合程度以提高系统的稳定性。最近在做毕业设计,在开发中采用了autofac来进行依赖注入,这里是对踩到的一些坑的解决方法,希望可以给同样不幸进入这些坑中的童鞋们提供一些解决思路。
对于IOC、DI相关的概念由于自己也是一知半解的,推荐T2噬菌体的这篇 依赖注入那些事儿 写的很详细也很好理解。
AutoFac文档地址:http://autofac.readthedocs.io/en/latest/getting-started/index.html
使用AutoFac需要引用的类库dll:Autofac.dll、Autofac.Configuration、Microsoft.Extensions.Configuration.Xml
PS:我是采用xml进行配置的AutoFac,如果你采用json进行配置,则需要引用Microsoft.Extensions.Configuration.Xml,使用nuget即可获取到这些引用dll。
二、实例
项目结构如下图所示,autofac涉及到类库如下
PSU.Factory:autofac配置相关信息
PSU.Domain:功能接口的实现类
PSU.IService:功能接口
PSU.Controllers:控制器

PSU.IService、PSU.Domain就是基本的接口与其实现类,也就没什么东西了,测试的代码如下:
//-----------------------------------------------------------------------
// <copyright file= "IIndex.cs">
// Copyright (c) Danvic712. All rights reserved.
// </copyright>
// Author: Danvic712
// Date Created: 2018/1/9 星期二 16:37:48
// Modified by:
// Description: 管理员首页操作邻域
//-----------------------------------------------------------------------
using PSU.Models.Area.Administrator.Home;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace PSU.IService.Area.Administrator.Home
{
public interface IIndex
{
/// <summary>
/// 页面初始化加载
/// </summary>
/// <param name="webModel"></param>
/// <returns></returns>
IndexWebModel Init(IndexWebModel webModel);
}
}
接口定义
//-----------------------------------------------------------------------
// <copyright file= "IndexDomain.cs">
// Copyright (c) Danvic712. All rights reserved.
// </copyright>
// Author: Danvic712
// Date Created: 2018/1/9 星期二 16:42:53
// Modified by:
// Description: 管理员首页操作邻域接口实现
//-----------------------------------------------------------------------
using PSU.IService.Area.Administrator.Home;
using PSU.Models.Area.Administrator.Home;
using System; namespace PSU.Domain.Area.Administrator.Home
{
public class IndexDomain : IIndex
{
/// <summary>
/// 页面初始化加载
/// </summary>
/// <param name="webModel"></param>
/// <returns></returns>
public IndexWebModel Init(IndexWebModel webModel)
{
webModel = new IndexWebModel();
return webModel;
}
}
}
接口实现类
PSU.Factory这个类库里写的是autofac的配置方法,在写之前让我们先看看官方的Demo:


简单翻译一下
- 你需要在你的项目里加载Microsoft.Extensions.Configuration 这个dll,如果你使用json进行配置的话,你需要加载 Microsoft.Extensions.Configuration.Json 这个dll,而我是通过xml文件进行配置,则需要加载 Microsoft.Extensions.Configuration.Xml
- 通过实例化ConfigurationBuilder来加载配置文件
- 注册配置组件
- 在容器中注册配置模块
因为我们会把所有的接口与实现类的映射放置于xml文件中,将所有的模块注册在容器中,通过对于官方方法的封装,创建一个静态方法去自由的选择加载需要接口与实现类,代码和配置文件如下:
//-----------------------------------------------------------------------
// <copyright file= "MAutoFac.cs">
// Copyright (c) Danvic712. All rights reserved.
// </copyright>
// Author: Danvic712
// Date Created: 2018/1/8 星期一 13:23:04
// Modified by:
// Description: AutoFac帮助类
//-----------------------------------------------------------------------
using Autofac;
using Autofac.Configuration;
using Microsoft.Extensions.Configuration; namespace PSU.Factory
{
public class MAutoFac
{
/// <summary>
/// 缓存注册容器
/// </summary>
private static IContainer _container = null; /// <summary>
/// 注册并创建实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T CreateInstance<T>()
{
if (_container == null)
{
var builder = new ContainerBuilder(); //读取配置信息
//
IConfigurationBuilder config = new ConfigurationBuilder();
config.AddXmlFile("autofac.config"); //注册组件
var module = new ConfigurationModule(config.Build()); //注册模块
builder.RegisterModule(module); _container = builder.Build();
} return _container.Resolve<T>();
}
}
}
帮助类
<?xml version="1.0" encoding="utf-8" ?>
<autofac defaultAssembly="PSU.IService">
<!--Administrator:首页接口-->
<components name="0">
<type>PSU.Domain.Area.Administrator.Home.IndexDomain,PSU.Domain</type>
<services name="0" type="PSU.IService.Area.Administrator.Home.IIndex" />
<injectProperties>true</injectProperties>
</components>
</autofac>
配置文件
创建一个返回类型是泛型的静态方法,通过 Resolve<T>() 用来解析容器中已经注册的实例T,并对给其进行赋值,这样,我们就可以通过传入指定的接口来获取对应的实现方法。
对于XML配置文件,如果你是采用VS生成的配置文件模版,你需要移除 configuration 根节点,直接使用 autofac 作为XML文档的根节点,切记,否则你将无法读取到配置信息。同时,如果你是和我一样的直接写好配置文件的地址,你需要将配置文件放置在Web项目的根目录下,或者显示写好加载的配置文件的所在地址。
配置相关解释:
1、defaultAssembly 默认的命名空间;如果type节点或者services节点的属性type没有设置类所在命名空间的话,将默认在defaultAssembly下查找类,type节点和services节点的属性type设置格式为MyType,MyAssembly;
2、多个接口时添加多个components节点,name 属性依次添加;
3、type节点对应接口实现类所在的位置(命名空间.类名,命名空间) --- 英文逗号;
4、services节点对应接口所在的位置(命名空间.接口类名)
5、injectProperties节点:是否启用组件的属性注入
在控制器调用接口实例,我是采用的重写 Controller 类的 Inintalize 方法,实现接口的注入,这样我们就可以在控制器中调用接口里的方法了,实现方法如下图所示。
//-----------------------------------------------------------------------
// <copyright file= "HomeController.cs">
// Copyright (c) Danvic712. All rights reserved.
// </copyright>
// Author: Danvic712
// Date Created: 2017/12/20 星期三 14:20:40
// Modified by:
// Description: Administrator-Home控制器
//-----------------------------------------------------------------------
using PSU.Factory;
using PSU.IService.Area.Administrator.Home;
using PSU.Models.Area.Administrator.Home;
using System.Web.Mvc;
using System.Web.Routing; namespace PSU.Controllers.Areas.Administrator
{
public class HomeController : Controller
{
#region Initializes private IIndex _iService; protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext); if (_iService == null)
{
_iService = MAutoFac.CreateInstance<IIndex>();
}
} #endregion #region Service public ActionResult Index(IndexWebModel webModel)
{
_iService.Init(webModel);
return View(webModel);
} #endregion
}
}
控制器
至此,我们要完成的也就差不多了,运行项目看看,咦,发现报错,查看报错信息,提示我们找不到PSU.Domain这个类库dll

Web项目,它所依赖的dll全部位于网站根目录下面的bin文件夹中,由于我们采用IOC加载接口实现层,Web层只引用接口,不引用接口实现层,所以autofac无法在项目中找到PSU.Domain这个dll,所以我们只要把这个dll给移动到Web项目的bin目录下面就可以了。编译生成后手动移动,繁琐、费事。这里我采用的是通过在PSU.Domain这里类库的属性上添加后期生成命令完成操作。重新生成下项目,预览这个视图页面,bingo,可以了。

三、其它
1、通过属性后期生成事件生成接口实现类库到bin文件夹里,有人说在release模式下,执行失败,我还没到这一步,所以就不得而知了,解决方案可以见链接 =》https://social.msdn.microsoft.com/Forums/zh-CN/caf363ec-e0f9-41da-ad24-60993e83f190/releasebindll?forum=adonetzhchs
2、代码完成之后,才发现AutoFac有专门的一个在MVC项目如何使用的实例,如果有童鞋用过的话,可以说说这两种的优劣,示例见链接 =》http://autofac.readthedocs.io/en/latest/integration/mvc.html
3、个人的一点使用实例,希望对你有点用处,如果中间有说的不对的地方,欢迎指点
4、欢迎转载,注明出处即可
AutoFac - 将 autofac 应用于MVC多层项目的更多相关文章
- SharpZipLib.dll 压缩文件,可以应用于MVC, webform. C# windows application 等等地方
Nuget 安装:Install-Package ICSharpCode.SharpZipLib.dll private void WriteZipFile(string[] filesToZip, ...
- ASP.NET IOC之 AutoFac的认识和结合MVC的使用
这几天研究了解发现AutoFac是个牛X的IOC容器,是.NET领域比较流行的IOC框架之一,传说是速度最快的,~ 据相关资料,相关学习,和认知,遂做了一些整理 优点: 它是C#语言联系很紧密,也就是 ...
- ASP.NET MVC IOC依赖注入之Autofac系列(一)- MVC当中应用
话不多说,直入主题看我们的解决方案结构: 分别对上面的工程进行简单的说明: 1.TianYa.DotNetShare.Model:为demo的实体层 2.TianYa.DotNetShare.Repo ...
- IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用
Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...
- Git应用于Android项目的入门知识:我的理解
Git应用于Android项目的基本知识. 常常将git,repo和gerrit三种工具配合起来使用,使Android开发中的部分工作自动化.并适应敏捷项目管理的需要. repo是Go ...
- MVC 无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式
无法将带 [] 的索引应用于“System.Dynamic.DynamicObject”类型的表达式 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代 ...
- 领域驱动和MVVM应用于UWP开发的一些思考
领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...
- ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- ASP.NET MVC搭建项目后台UI框架—7、统计报表
ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET M ...
随机推荐
- 4、Nginx安装与配置
一.简介 Nginx官网:http://nginx.org/ Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存.该软件由 Igor ...
- 安卓获取签名SHA1
Debug签名:D:\Java\jdk1.8.0_151\bin>keytool -list -v -keystore debug.keystore 无需密码 Relese签名:D:\Java ...
- docker 安装mysql
1.安装docker 参见这个文章第一步:https://www.cnblogs.com/yanglei-xyz/p/10600707.html 2.安装mysql 查找Docker Hub上的mys ...
- Python学习最佳路线图
python语言基础(1)Python3入门,数据类型,字符串(2)判断/循环语句,函数,命名空间,作用域(3)类与对象,继承,多态(4)tkinter界面编程(5)文件与异常,数据处理简介(6)Py ...
- CentOS7配置mailx使用外部smtp服务器发送邮件
转自huskiesir的博客: 发送邮件的两种方式: 1.连接现成的smtp服务器去发送(此方法比较简单,直接利用现有的smtp服务器比如qq.新浪.网易等邮箱,只需要直接配置mail.rc文件即可实 ...
- vijos搭建踩坑
nodejs我用的8.x版本,可以工作. 和制作组交谈之后他们说最好榨汁机和主机不要在同一系统下. vj4/vj4/handler/base.py的第343行 从 super(Connection, ...
- IOS开发中将定时器添加到runLoop中
runLoop主要就是为线程而生的.他能够让线程在有任务的时候保持工作状态,没有任务的时候让线程处于休眠待备状态. 主线程的runloop默认是开启的.主线程上创建的定时器已经默认添加到runLoop ...
- Oracle约束、索引
Oracle中的约束有五种,分别为: 非空:not null 主键:primary key 外键:foreign key 唯一:unique 检查:check 在数据字典视图 user_constra ...
- vue 源码学习三 vue中如何生成虚拟DOM
vm._render 生成虚拟dom 我们知道在挂载过程中, $mount 会调用 vm._update和vm._render 方法,vm._updata是负责把VNode渲染成真正的DOM,vm._ ...
- md5 加密文件
import hashlibimport os def get_md5(file_path): md5 = None if os.path.isfile(file_path): f = open(fi ...