//类ContainerBuilder中的方法:

RegisterType<T>()//注册类型T

AsImplementedInterfaces()//表示注册的类型,以接口的方式注册

Build()//创建一个容器

接口IContainer的方法:

Resolve<T>()//从容器中取出一个T类型的实例

1. 如何实现AsImplementedInterfaces()

builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces(); //以类ListMovieFinder的接口IMovieFinder注册

那么我使用 Resolve<IMovieFinder>()要获取一个接口实例的时候,会返回一个ListMovieFinder的实例

2. 如何实现对同一个类型的注册,后面的覆盖前面的注册, 如源代码中:

builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces();
builder.RegisterType<DBMovieFinder>().AsImplementedInterfaces();

后面的DBMovieFinder会覆盖掉ListMovieFinder的注册

这样,当我调用 Resolve<IMovieFinder>()要获取一个接口实例的时候,会返回一个DBMovieFinder的实例

protected void Application_Start()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); // Other MVC setup...
}

1. 首先创建一个ContainerBuilder(它会稍后为我们提供一个容器,我们可以从中取出我们所需的对象实例)

2. 注册当前Assembly中的所有Controllers到Builder,这样Builder就获取了当前MVC项目中的所有Controller类型

3. 创建容器

4. 用AutofacDependencyResolver替换MVC默认的DependencyResolver

一、使用Entity Framework Code First, 写代码创建Student表

 public class SchoolContext : DbContext
{
public SchoolContext()
: base("DefaultConnection")
{
} public DbSet<Student> Students { get; set; }
} [Table("Student")]
public class Student
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

首先我们可以创建一个接口:

 public interface IStudentRepository
{
IEnumerable<Student> GetStudents();
}

然后, 创建一个集成这个接口的类,这个类并不访问数据库,但是提供我们开发页面所需的数据。

  public class StubStudentRepository:IStudentRepository
{
public IEnumerable<Student> GetStudents()
{
return new[]
{
new Student {Id = , Name = "Sam", Age = }
};
}
}
  public class HomeController : Controller
{
public ActionResult Index()
{
IStudentRepository studentRepository = new StubStudentRepository();
//IStudentRepository studentRepository = new StudentRepository();//注释掉访问数据层的代码,用Stub类代替
var students = studentRepository.GetStudents(); return View(students);
}
}

实例化

IStudentRepository studentRepository = new StubStudentRepository()

Autofac大显身手

   public class HomeController : Controller
{
private readonly IStudentRepository _studentRepository;
//由构造函数来提供Controller的依赖IStudentRepository
public HomeController(IStudentRepository studentRepository)
{
_studentRepository = studentRepository;
} public ActionResult Index()
{
var students = _studentRepository.GetStudents(); return View(students);
}
}

修改Global.asax,

public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
//Autofac初始化过程
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);//注册所有的Controller
//开发环境下,使用Stub类
builder.RegisterAssemblyTypes(typeof (MvcApplication).Assembly).Where(
t => t.Name.EndsWith("Repository") && t.Name.StartsWith("Stub")).AsImplementedInterfaces();
//发布环境下,使用真实的数据访问层
//builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly).Where(
// t => t.Name.EndsWith("Repository")).AsImplementedInterfaces(); var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //其它的初始化过程
........
}
}

所有的controller就都是使用Stub类的实例

//开发环境下,使用Stub类
builder.RegisterAssemblyTypes(typeof (MvcApplication).Assembly).Where(
t => t.Name.EndsWith("Repository") && t.Name.StartsWith("Stub")).AsImplementedInterfaces();
private static void AutofacMvcRegister()
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterGeneric(typeof(DbContextBase<>)).As(typeof(IDataRepository<>));
Type baseType = typeof(IDependency);
Assembly[] assemblies = Assembly.GetExecutingAssembly().GetReferencedAssemblies()
.Select(Assembly.Load).ToArray();
assemblies = assemblies.Union(new[] { Assembly.GetExecutingAssembly() }).ToArray();
builder.RegisterAssemblyTypes(assemblies)
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
.AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证生命周期基于请求 //无效
//builder.RegisterType<DefaultCacheAdapter>().PropertiesAutowired().As<ICacheStorage>(); builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterFilterProvider();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
 public class ListMovieFinder : IMovieFinder
{
public List<Movie> FindAll()
{
return new List<Movie>
{
new Movie
{
Name = "Die Hard.wmv"
},
new Movie
{
Name = "My Name is John.MPG"
}
};
}
} public interface IMovieFinder
{
List<Movie> FindAll();
} public class Movie
{
public string Name { get; set; }
} public class MPGMovieLister
{
private readonly IMovieFinder _movieFinder;
public MPGMovieLister(IMovieFinder movieFinder)
{
_movieFinder = movieFinder;
} public Movie[] GetMPG()
{
var allMovies = _movieFinder.FindAll();
return allMovies.Where(m => m.Name.EndsWith(".MPG")).ToArray();
}
} internal class Program
{
private static IContainer _container;
private static void Main(string[] args)
{
InitIoC(); var lister = _container.Resolve<MPGMovieLister>(); foreach (var movie in lister.GetMPG())
{
Console.WriteLine(movie.Name);
}
Console.Read();
} private static void InitIoC()
{
var builder = new ContainerBuilder();
builder.RegisterType<ListMovieFinder>().AsImplementedInterfaces();
//builder.RegisterType<DBMovieFinder>().AsImplementedInterfaces();
builder.RegisterType<MPGMovieLister>();
_container = builder.Build();
}
}

IOC容器Autofac的更多相关文章

  1. IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用

    Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...

  2. Ioc容器Autofac系列(1)-- 初窥

     一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...

  3. IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)

    转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html  有修改 Autofac通过Controller默认构造 ...

  4. .net core2.0下Ioc容器Autofac使用

    .net core发布有一段时间了,最近两个月开始使用.net core2.0开发项目,大大小小遇到了一些问题.准备写个系列介绍一下是如何解决这些问题以及对应技术.先从IOC容器Autofac开始该系 ...

  5. IoC容器Autofac学习笔记

    一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...

  6. [转]Ioc容器Autofac

    本文转自:http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041.html Ioc容器Autofac系列(1)-- 初窥   前言 第一次接触A ...

  7. IOC容器 - Autofac概述

    Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...

  8. 用Rider写一个有IOC容器Autofac的.net core的程序

    一:Autofac是一个和Java里的Spring IOC容器一样的东西,不过它确实没有Spring里的那么方便,主要是在于它没有提供足够的Api和扫描方式等等,不过优点是它比Spring要快很多,而 ...

  9. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

  10. IoC容器Autofac之IOC/DI基本概念(二)

    原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...

随机推荐

  1. scrapy详细数据流走向(个人总结)

    直接从数据流的角度来说比较容易理解: ·1.Spider创建一个初识url请求,把这个请求通过Engine转给Scheduler调度模块.然后Scheduler向Engine提供一个请求(这个请求是一 ...

  2. 洛谷——P1689 方程求解

    P1689 方程求解 题目描述 给一个方程,形如X+Y=Z或X-Y=Z.给出了其中两个未知数,请求出第三个数.未知数用‘?’表示,等式中也许会出现一些多余的空格. 输入输出格式 输入格式: 一行,方程 ...

  3. 如何加快exp/imp的速度 - direct=y

       http://blog.itpub.net/35489/viewspace-613625 Oracle9i 或 10g  . 1.  内存中关系到exp的速度的是  large_pool_siz ...

  4. 取消Gridvie中button的焦点

    Gridview中添加button,onclick方法使得 GridView的setOnItemClickListener方法无效. 解决方法: 设置Button的XML布局文件,也就是自定义的Ada ...

  5. 【后缀数组】poj3693 Maximum repetition substring

    sa在清空方面存在一些奇怪的问题……难以ac.(留坑?)

  6. 【拓扑排序】CODEVS 2833 奇怪的梦境

    拓扑排序模板. #include<cstdio> #include<vector> #include<stack> using namespace std; #de ...

  7. [HDU6271]Master of Connected Component

    [HDU6271]Master of Connected Component 题目大意: 给出两棵\(n(n\le10000)\)个结点的以\(1\)为根的树\(T_a,T_b\),和一个拥有\(m( ...

  8. Saga的实现模式——进化(Saga implementation patterns – variations)

    在之前的几个博客中,我主要讲了两个saga的实现模式: 基于command的控制者模式 基于事件的观察者模式 当然,这些都不是实现saga的唯一方式.我们甚至可以将这些结合起来. 发布者——收集者 回 ...

  9. oracle--v$lock type字段详解

    Name Description AD ASM Disk AU Lock AF Advisor Framework AG Analytic Workspace Generation AK GES De ...

  10. 安网讯通签约孟强美容CRM

    整形美容CRM软件是辽宁安网讯通有限公司为孟强整形医院定制开发的一套客户关系管理软件,软件专门针对整形美容行业专科门诊的需求,能满足大中小整形美容机构或或各种专科科室的日常业务需求. 主要功能包括: ...