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中牛刀小试的更多相关文章

  1. Autofac3 在MVC4中的运用原理

    这是一种新的开发模式,注入开发模式,或者叫它IOC模式,说起IOC你可以这样去理解它,它为你的某个实现流出一个注入点,你生产的对象,可以根据你之前的配置进行组合.  IOC全称是Inversion o ...

  2. MVC4中基于bootstrap和HTML5的图片上传Jquery自定义控件

    场景:mvc4中上传图片,批量上传,上传前浏览,操作.图片进度条. 解决:自定义jquery控件 没有解决:非图片上传时,会有浏览样式的问题; 解决方案; 1.样式 – bootstrap 的css和 ...

  3. ASP.NET MVC4中的bundles特性引发服务器拒绝访问(403错误)

    在ASP.NET MVC4中微软引入了bundles特性,这个特性可以将服务器端的多个Javascript或多个css文件捆绑在一起作为一个单一的URL地址供客户端浏览器调用,从而减少了页面上Http ...

  4. MVC4中使用Ninject

    MVC4中使用Ninject 1.NuGet获取Ninject.dll .NET技术交流群 199281001 .欢迎加入. 2.全局注册  Global.asax.cs  RegisterNinje ...

  5. mvc4中jquery-ui日期控件datepicker的应用

    mvc4中jquery-ui日期控件datepicker的应用 本文适合mvc中日期选择需要的同学: 假设读者已经具备了mvc4和javascript中的相关知识 一. 开始项目之前把项目中目录:/C ...

  6. WebSocket在ASP.NET MVC4中的简单实现

    WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...

  7. ASP.NET MVC4中使用NHibernate

    ASP.NET MVC4中使用NHibernate 1:下载安装NHibernate 打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages.你会 ...

  8. MVC4中使用SignalR

    MVC4中使用SignalR 前言 周末在偶尔翻阅微软官网的时候看到Getting Started with SignalR and MVC 4此篇文章,知道了signalr这个东西,貌似这个出来很长 ...

  9. MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates)

    转载于: MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates) 虽然 [Display(Name="XX ...

随机推荐

  1. SQLite关系型数据库

    SQLiteOpenHelper的使用:       首先声明一个DatabaseHelper类,这个类继承于SQLiteOpenHelper类,首先得有构造函数,声明DatabaseHelper类如 ...

  2. 1.Java网络编程之概述

    黑马程序员_毕向东_Java基础视频教程第23天-01-网络编程(概述)学习笔记 网络通讯三要素: 1.IP地址 I.网络中设备的标识  II.不易记忆,可用主机名 www 万维网组织,baidu主机 ...

  3. 大小写互换-"数字字符串"转换成数字

    今天穿着hacker浑浊马甲在百度编程课堂实训习题中发现了这个很简单的问题,就做了下. 为了考虑输入的是否是数字,结果写好后竟然超时了. 不过里面用到的将字符串装换成数字的方法,感觉是个收获,因此在此 ...

  4. Sql Server函数全解(三)数据类型转换函数和文本图像函数

    一:数据类型转换函数 在同时处理不同数据类型的值时,SQL Server一般会自动进行隐士类型转换.对于数据类型相近的值是有效的,比如int和float,但是对于其它数据类型,例如整型和字符类型,隐士 ...

  5. jQuery-1.9.1源码分析系列(十) 事件系统——事件包装

    首先需要明白,浏览器的原生事件是只读的,限制了jQuery对他的操作.举个简单的例子就能明白为什么jQuery非要构造一个新的事件对象. 在委托处理中,a节点委托b节点在a被click的时候执行fn函 ...

  6. MySQL5.7不停业务将传统复制变更为GTID复制

      由于GTID的优势,我们需要将传统基于file-pos的复制更改为基于GTID的复制,如何在线变更成为我们关心的一个点,如下为具体的方法: 目前我们有一个传统复制下的M-S结构: port 330 ...

  7. android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存

    经常会用到 网络文件 比如查看大图片数据 资源优化的问题,当然用开源的项目  Android-Universal-Image-Loader  或者 ignition 都是个很好的选择. 在这里把原来 ...

  8. asp.net教程:编译错误同时存在于不同dll中

    asp.net 编译错误类型“同时存在于”不同的dll中. 出现这种错误大概有三种情况: 1.ASPX页面,一个*.ASPX,对应着一个*.cs文件,两者其实是一个文件,通过两者实现代码分离,每个*. ...

  9. Java02

    一.IDE的概念.eclipse的介绍.安装.使用 (用eclipse写HelloWorld例子)     1.什么是IDE(Integrated Development Environment)? ...

  10. 解决jdk1.8上编译dubbo失败

    首先从https://github.com/alibaba/dubbo/archive/master.zip下载最新源码,目前最新版本为2.5.4-SNAPSHOT. 我使用的是JDK 1.8.0_0 ...