IOC容器Autofac
//类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的更多相关文章
- IoC容器Autofac(5) - Autofac在Asp.net MVC Filter中的应用
Autofac结合EF在MVC中的使用,上一篇IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)已经介绍了.但是只是MVC中Co ...
- Ioc容器Autofac系列(1)-- 初窥
一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...
- IoC容器Autofac - Autofac + Asp.net MVC + EF Code First(转载)
转载地址:http://www.cnblogs.com/JustRun1983/archive/2013/03/28/2981645.html 有修改 Autofac通过Controller默认构造 ...
- .net core2.0下Ioc容器Autofac使用
.net core发布有一段时间了,最近两个月开始使用.net core2.0开发项目,大大小小遇到了一些问题.准备写个系列介绍一下是如何解决这些问题以及对应技术.先从IOC容器Autofac开始该系 ...
- IoC容器Autofac学习笔记
一.一个没有使用IoC的例子 IoC的全称是Inversion of Control,中文叫控制反转.要理解控制反转,可以看看非控制反转的一个例子. public class MPGMovieList ...
- [转]Ioc容器Autofac
本文转自:http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041.html Ioc容器Autofac系列(1)-- 初窥 前言 第一次接触A ...
- IOC容器 - Autofac概述
Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...
- 用Rider写一个有IOC容器Autofac的.net core的程序
一:Autofac是一个和Java里的Spring IOC容器一样的东西,不过它确实没有Spring里的那么方便,主要是在于它没有提供足够的Api和扫描方式等等,不过优点是它比Spring要快很多,而 ...
- ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)
IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...
- IoC容器Autofac之IOC/DI基本概念(二)
原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...
随机推荐
- 模板—数据结构—LCT
模板—数据结构—LCT Code: #include <cstdio> #include <algorithm> using namespace std; #define N ...
- codeforces 713C C. Sonya and Problem Wihtout a Legend(dp)(将一个数组变成严格单增数组的最少步骤)
E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...
- Longest Absolute File Path -- LeetCode
Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...
- 【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1
观察一下,将整个过程写出来,会发现形成一棵满二叉树,每一层要么全是0,要么全是1. 输出的顺序是其中序遍历. 每一层的序号形成等差数列,就计算一下就可以出来每一层覆盖到的区间的左右端点. 复杂度O(l ...
- 【矩阵乘法】图中长度为k的路径的计数
样例输入 4 2 0 1 1 0 0 0 1 0 0 0 0 1 1 0 0 0 样例输出 6 #include<cstdio> #include<vector> using ...
- 零基础带你看Spring源码——IOC控制反转
本章开始来学习下Spring的源码,看看Spring框架最核心.最常用的功能是怎么实现的. 网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的观点换个描述就放出来.这并不能说有问题 ...
- 文件描述符与socket连接
每个进程开启一个soeket连接,都会占用一个文件描述符. 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件. 文件 ...
- hdu 1054 Strategic Game(tree dp)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 页面自动适应大小&&获取页面的大小
直接上代码: <script type="text/JavaScript"> var size = 1.0; function showheight() { alert ...
- Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南
在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...