Autofac在MVC4中牛刀小试
Autofac是传说中速度最快的一套.NET高效的依赖注入框架。Autofac的介绍与使用请去参考Autofac全面解析系列(版本:3.5)。 这里介绍的已经挺详细的啦。
下面我就先来说说MVC4中使用Autofac吧,至于工厂模式与依赖注入的区别的话,这个我简单的解释一下,也只是我的个人观点。使用依赖注入最主要的就是为了解耦,当然工厂模式也可以实现实现大部分的解耦,这个是毋庸置疑的。工厂模式实现方式是向客户端提供一个接口,使客户端不要指定具体产品对象,创建多个产品族的产品对象。将具体实例的创建延迟到对应实现的子类中。但是当我们每次要去拿这个接口的时候就要通过这个工厂来拿了,那么就是说虽然我们排除了对实现接口的具体的方法的依赖,但是我们对工厂模式产生接口的方式产生了依赖。那么依赖注入就可以解决这个依赖了。我们在使用接口的时候可以完全的不需要考虑去取这个接口然后再继续使用接口。我们只要直接拿接口来用就可以了。这就是我个人对工厂模式和依赖注入的解释了,是不是把你们给搞混淆了。
下面我就在MVC4中使用下Autofac吧。首先我们要先去NuGet下载一个Autofac MVC4的东西


点击安装。
将AuthoryManage.AutofacRegister 也引入Autofac包
导入成功之后,我先在AuthoryManage.InterfaceRepository这个类库中添加一个接口,
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace AuthoryManage.InterfaceRepository {
public interface IBaseRepository {
string GetData();
}
}
接口
然后在AuthoryManage.Repository中分别加入下面这些类
下面是代码:
public class BaseRepository :IBaseRepository{
public string GetData() {
return "这里是MsSql";
}
}
MsSql.BaseRepository
public class BaseRepository : IBaseRepository {
public string GetData() {
return "这里是MySql";
}
}
MySql.BaseRepository
public class BaseRepository : IBaseRepository {
public string GetData() {
return "这里是Oracle";
}
}
Oracle.BaseRepository
记得添加对AuthoryManage.InterfaceRepository的引用。
接下来写下Service层的代码
public interface IBaseService {
string GetData();
}
public interface IBaseService {
string GetData();
}
AuthoryManage.InterfaceService.IBaseService
最值得注意的Service实现类代码,请看:
public class BaseService:IBaseService {
private readonly IBaseRepository _repository;
public BaseService(IBaseRepository repository) {
this._repository = repository;
}
public string GetData() {
return _repository.GetData();
}
}
AuthoryManage.Service.BaseService
这是建好之后的Service层结构

也要记得引用对应DLL,那么接下来就看看控制器这边怎么写吧。
我就简单先建立一个Home控制器吧。
并添加对service的引用。
public class HomeController : Controller {
//
// GET: /Home/
private IBaseService _service;
public HomeController(IBaseService service) {
this._service = service;
}
public ActionResult Index() {
ViewBag.SSSS = _service.GetData();
return View();
}
}
AuthoryManage.Web.Controllers.HomeController
视图代码如下:
@{
ViewBag.Title = "Index";
}
<h2>@ViewBag.SSSS</h2>
接下来就去Global中实现我们的注入:
using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Autofac.Integration.Mvc;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace AuthoryManage.Web {
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); var builder = new ContainerBuilder();
var assembly = Assembly.GetExecutingAssembly();
var repository = System.Reflection.Assembly.Load("AuthoryManage.MsSqlRepository");
builder.RegisterAssemblyTypes(repository, repository)
.AsImplementedInterfaces();
var service = System.Reflection.Assembly.Load("AuthoryManage.Service");
builder.RegisterAssemblyTypes(service, service)
.AsImplementedInterfaces();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//容器
var container = builder.Build();
//注入改为Autofac注入
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
}
Global
要记住,在反射程序集的时候你要引用相对应的程序集。然后我们在运行一下程序来看下界面效果:
我们把global.asax里面的代码更改下,改成对Oracle的程序集注册,
using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Autofac.Integration.Mvc;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace AuthoryManage.Web {
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); var builder = new ContainerBuilder();
var assembly = Assembly.GetExecutingAssembly();
var repository = System.Reflection.Assembly.Load("AuthoryManage.OracleRepository");
builder.RegisterAssemblyTypes(repository, repository)
.AsImplementedInterfaces();
var service = System.Reflection.Assembly.Load("AuthoryManage.Service");
builder.RegisterAssemblyTypes(service, service)
.AsImplementedInterfaces();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//容器
var container = builder.Build();
//注入改为Autofac注入
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
}
}
看下运行效果:
需要注意的是我们需要引用下AuthoryManage.OracleRepository这个dll引用,那么就是说我实现的方法更改了 我UI层也要去改动对应的引用。
Autofac在MVC4中牛刀小试的更多相关文章
- Autofac3 在MVC4中的运用原理
这是一种新的开发模式,注入开发模式,或者叫它IOC模式,说起IOC你可以这样去理解它,它为你的某个实现流出一个注入点,你生产的对象,可以根据你之前的配置进行组合. IOC全称是Inversion o ...
- MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件
场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...
- ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)
在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...
- MVC4中使用Ninject
MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册 Global.asax.cs RegisterNinje ...
- mvc4中jquery-ui日期控件datepicker的应用
mvc4中jquery-ui日期控件datepicker的应用 本文适合mvc中日期选择需要的同学: 假设读者已经具备了mvc4和javascript中的相关知识 一. 开始项目之前把项目中目录:/C ...
- WebSocket在ASP.NET MVC4中的简单实现
WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...
- ASP.NET MVC4中使用NHibernate
ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...
- MVC4中使用SignalR
MVC4中使用SignalR 前言 周末在偶尔翻阅微软官网的时候看到Getting Started with SignalR and MVC 4此篇文章,知道了signalr这个东西,貌似这个出来很长 ...
- MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates)
转载于: MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates) 虽然 [Display(Name="XX ...
随机推荐
- 数据库基础及T-SQL语句
字符类型: int 整型float 小数double 小数varchar(20) 字符串bit 布尔型数据datetime 日期时间类型text 长文本 (以下两种不经常使用) money 存货币im ...
- tomcat源码剖析系列
一个简单的web服务器 一个简单的servlet容器 连接器 创建httpRequest 创建HttpResponse 容器 生命周期 日志记录器 载入器 Session管理 关闭钩子 启动tomca ...
- CSS垂直居中和水平居中
前言 CSS居中一直是一个比较敏感的话题,为了以后开发的方便,楼主觉得确实需要总结一下了,总的来说,居中问题分为垂直居中和水平居中,实际上水平居中是很简单的,但垂直居中的方式和方法就千奇百怪了. 内联 ...
- Extjs Panel
刚学习Extjs @{ Layout = "~/_SiteLayout.cshtml"; Page.Title = "欢迎访问我的网站!"; } @{ stri ...
- 基础笔记(三):网络协议之Tcp、Http
目录 一.网络协议 二.TCP(Transmission Control Protocol,传输控制协议) TCP头格式 TCP协议中的三次握手和四次挥手 TCP报文抓取工具 三.HTTP(Hyper ...
- 利用SCORE法则来总结一次偷懒的单元测试过程
最近遇到一个单元测试的问题,本周正好学个了一个SCORE法则,这里正好练练手应用此法则将问题的前因后果分享给大家. S:背景 代码要有单元测试,检测的标准就是统计代码的单元测试覆盖率,程序员需要达到 ...
- 十一个行为模式之备忘录模式(Memento Pattern)
定义: 在不破坏原有封装的情况下,捕获一个对象的内部状态,并在对象之外保存.当对象出错或者无效是,可以根据该备忘录进行恢复. 结构图: Originator:原发类,被记录的对象,包含若干内部状态.一 ...
- JavaScript 变量
一,JavaScript 变量(存储信息的容器) 与代数一样,JavaScript 变量可用于存放值(比如 x=2)和表达式(比如 z=x+y). 变量可以使用短名称(比如 x 和 y),也可以使用描 ...
- Sass-也许你想和CSS玩耍起来(上篇)
我们努力,我们坚持,共勉! 众所周知,css其实不是一门编程语言,熟悉的人都知道css全称Cascading Style Sheets(层叠样式表)是一种用来表现HTML(标准通用标记语言的一个应用) ...
- SharePoint 快捷获取列表栏内部名称
在列表设置页面点击浏览器书签获取列表字段内部名称,使用效果如下图: 如何使用: 修改浏览器上任意书签的url地址为以下代码,注意:代码中不能有换行符 javascript:(function(){va ...