在开始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初识的更多相关文章

  1. Autofac 框架初识与应用

    文字首发地址 一.前言 这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置I ...

  2. ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便

    初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...

  3. ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便(转载)

    原文地址:https://www.cnblogs.com/Andre/p/9604759.html 初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通 ...

  4. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  5. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  6. Autofac - 生命周期

    实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...

  7. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  8. Autofac 的点滴

    泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...

  9. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

随机推荐

  1. PHP之旅3 php数组以及遍历数组 以及each() list() foreach()

    php的数组的定义 <?php //php中定义数组时可以通过索引直接进行赋值: $mArr[0]="哈哈"; $mArr[1]=70; $mArr[2]='haha'; e ...

  2. cas单点登陆系统-建立单点登陆系统的应用

    上一篇如果已经操作成功,说明casServer已经实现了,下面就是搭建casClient与casServer联合调试.代码已经上传到github上.你可以下载看看,如果自己在搭建的过程中遇到问题,你也 ...

  3. Centos7永久修改IP地址

    Centos7永久修改IP地址 永久修改IP地址,即为设置静态的IP地址. 一.修改IP地址前需要准备的工作 1.虚拟机需要使用桥接的网络模式 虚拟机关机状态下,点击"编辑虚拟机设置&quo ...

  4. python3中文件操作及编码

    #之前一直没明白文件处理中的w和wb的区别到底是什么,#在看过视频后才知道,原来在linux里面是没有区别的,#但是在windows里面就能够看出区别来了#下面来个例子: with open(&quo ...

  5. 【BZOJ4184】shallot 线性基

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题. 但是此题会删除 ...

  6. 在MVC过滤器中获取触发的Controller、Action、参数 等

    首先是实现接口System.Web.Mvc.IActionFilter的过滤器 获取Controller.Action.参数 方法一. string actionName = filterContex ...

  7. EF基础知识小记七(拆分实体到多个表以及拆分表到多个实体)

    一.拆分实体到多个表 1.在日常开发中,会经常碰到一些老系统,当客户提出一些新的需求,这些需求需要在原来的表的基础上加一些字段,大多数人会选择通过给原表添加字段的方式来完成这些需求,方法,虽然可行,但 ...

  8. 暴力攻击 PHP 脚本 初探

    考虑下面的HTML表单: CODE: <form action="http://example.org/login.php" method="POST"& ...

  9. Linux C 遍历指定目录

    #include<stdio.h> //标准输入输出 #include<unistd.h> //各种系统调用 #include<dirent.h> //与目录有关的 ...

  10. rails image_tag生成图片标签

    image_tag(source, options={}) Link Returns an HTML image tag for thesource. The source can be a full ...