autofac初识
在开始autofac时,有必要先了解两个关键词:“控制反转(IoC/Inverse Of Control)”与“依赖注入(DI/Dependence injection)”。
控制反转(IoC):它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。
依赖注入(DI):就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
public class BMW
{
/// <summary>
///
/// </summary>
/// <param name="series">车系</param>
public void Create(string series)
{
Console.WriteLine("生产了宝马" + series);
}
} public class Porsche
{
/// <summary>
///
/// </summary>
/// <param name="series">车系</param>
public void Create(string series)
{
Console.WriteLine("生产了宝时捷" + series);
}
}
上面定义了宝马与保时捷两个类,它们都有Create方法,参数车系,传统的调用方式如下:
BMW bmw = new BMW();
bmw.Create("730Li");
Porsche porsche = new Porsche();
porsche.Create("卡宴");
这里我们看到,需要使用new创建实例并调用方法
改进,使用工厂方式
public interface ICarCreator
{
void Create(string series);
} public class BMW : ICarCreator
{
/// <summary>
///
/// </summary>
/// <param name="series">车系</param>
public void Create(string series)
{
Console.WriteLine("生产了宝马" + series);
}
} public class Porsche : ICarCreator
{
/// <summary>
///
/// </summary>
/// <param name="series">车系</param>
public void Create(string series)
{
Console.WriteLine("生产了宝时捷" + series);
}
}
调用方式,这里使用了反射的形式,在配置文件里配置(类似支持多个数据库的操作工厂)
ICarCreator car = (ICarCreator)Assembly.GetExecutingAssembly().CreateInstance(ConfigurationManager.AppSettings["Brand"]); //使用了反射方式
car.Create("suv");
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Brand" value="AutofacDemo1.BMW"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
进一步改进,使用autofac,将创建实例交给autofac
var builder = new ContainerBuilder(); builder.RegisterType<ICarCreator>();
builder.RegisterType<BMW>().As<ICarCreator>();
//builder.RegisterType<Porsche>().As<ICarCreator>();
Container = builder.Build();
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.Resolve<ICarCreator>();
writer.Create("轿车");
}
完整的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using Autofac; namespace AutofacDemo1
{
class Program
{
private static IContainer Container { get; set; }
static void Main(string[] args)
{
#region 普通的调用
//BMW bmw = new BMW();
//bmw.Create("730Li");
//Porsche porsche = new Porsche();
//porsche.Create("卡宴");
#endregion #region 工厂的方式
//ICarCreator car = (ICarCreator)Assembly.GetExecutingAssembly().CreateInstance(ConfigurationManager.AppSettings["Brand"]); //使用了反射方式
//car.Create("suv");
#endregion #region 使用Ioc[Autofac]
var builder = new ContainerBuilder(); builder.RegisterType<ICarCreator>();
builder.RegisterType<BMW>().As<ICarCreator>();
//builder.RegisterType<Porsche>().As<ICarCreator>();
Container = builder.Build();
using (var scope = Container.BeginLifetimeScope())
{
var writer = scope.Resolve<ICarCreator>();
writer.Create("轿车");
}
#endregion Console.ReadKey();
}
} public interface ICarCreator
{
void Create(string series);
} public class BMW : ICarCreator
{
/// <summary>
///
/// </summary>
/// <param name="series">车系</param>
public void Create(string series)
{
Console.WriteLine("生产了宝马" + series);
}
} public class Porsche : ICarCreator
{
/// <summary>
///
/// </summary>
/// <param name="series">车系</param>
public void Create(string series)
{
Console.WriteLine("生产了宝时捷" + series);
}
}
}
autofac初识的更多相关文章
- Autofac 框架初识与应用
		
文字首发地址 一.前言 这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置I ...
 - ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
		
初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...
 - ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)
		
原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...
 - AutoFac在项目中的应用
		
技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...
 - Autofac - MVC/WebApi中的应用
		
Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...
 - Autofac - 生命周期
		
实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...
 - Autofac - 属性注入
		
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
 - Autofac 的点滴
		
泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...
 - Android动画效果之初识Property Animation(属性动画)
		
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
 
随机推荐
- BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
			
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 29035 Solved: 7604 Descript ...
 - FastAdmin 前端页面传参
			
如果我们需要自己在控制器中透传数据到JS中去,则可以使用控制器的assignconfig方法来透传,使用如下 $this->assignconfig('demo', ['name'=>'名 ...
 - 前端入门CSS(2)
			
参考: https://www.cnblogs.com/liwenzhou/p/7999532.html 背景属性 /*背景颜色*/background-color: red; /*背景图片*/ ba ...
 - Codeforces Round #456 (Div. 2)  B. New Year's Eve
			
B. New Year's Eve time limit per test 1 second memory limit per test 256 megabytes input standard in ...
 - Elasticsearch安装与环境配置
			
Elasticsearch安装与环境配置 确保机器上已经安装了jdk7以上版本 下载:官网下载地址:https://www.elastic.co/downloads/elasticsearch 将下载 ...
 - Android studio 安装的安装若干问题
			
1.在国内如何更新android sdk? 由于众所周知的某些原因,我们无法直接连接android sdk的更新服务更新sdk,所以可以通过国内的ftp站点把常用的sdk组件如android plat ...
 - MVC Filter中加入验证并跳转
			
public class BuildingFilter : ActionFilterAttribute { /// <summary> /// 验证 Building Cookie add ...
 - oracle case when 语句的用法详解
			
1. CASE WHEN 表达式有两种形式 复制代码代码如下: --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他 ...
 - 【xsy1162】鬼计之夜 最短路+二进制拆分
			
套路题(然而我没看题解做不出来) 题目大意:给你一个$n$个点,$m$条有向边的图.图中有$k$个标记点,求距离最近的标记点间距离. 数据范围:$n,m,k≤10^5$. 设$p_i表$示第$i$个标 ...
 - (转)python 之路,200行Python代码写了个打飞机游戏!
			
原文:https://www.cnblogs.com/alex3714/p/7966656.html