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 ...
随机推荐
- rawt
这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...
- IOS 开发入门
1.Getting Started https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&t ...
- $_SERVER[]数组解析
$_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果.__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名. 如果 PHP 以命令行方式运行,该 ...
- setInterval传递参数
参照:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout 平时我们使用定时器的时 ...
- Flask从入门到精通之Flash消息
请求完成后,有时需要让用户知道状态发生了变化.这里可以使用确认消息.警告或者错误提醒.一个典型例子是,用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上面显示一个消息,提 ...
- [HTML] H5在webApp中的注意事项
常用的meta标签 <!--防止手机中网页放大和缩小--> <meta name="viewport" content="width=device-wi ...
- 彻底弄懂JS的事件冒泡和事件捕获(不推荐阅读)
由于搬去敌台了,好久没来博客园,今天无意中翻到有“误认子弟”的评论,这里特意做个说明. 本文中关于事件冒泡和事件捕获的描述和例子都是OK的,错就错在后面用jquery去展示了利用事件冒泡的例子有误,其 ...
- leetcode-908-最小差值 I
题目描述: 给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中. 在此过程之后,我们得到一些数组 B. 返回 ...
- 平衡二叉树(AVL)的理解和实现(Java)
AVL的定义 平衡二叉树:是一种特殊的二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1.从平衡二叉树的名字中可以看出来,它是一种高度平衡的二叉排序树.那么什么叫做高度平衡呢?意思就是要么它 ...
- Docker容器(三)
一.创建容器 容器是Docker另一个核心的概念,简单来说,容器是镜像的一个运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层 1.1. 新建容器 使用docker crea ...