AutoFac学习Demo1——官网Demo
AutoFac实现Demo1
1、创建一个工作台(.NET Core)程序AutofacDemo1,nuget引入AutoFac,搜索第一个就是
2、创建输出接口IOutput及实现ConsoleOutput
using System;
using System.Collections.Generic;
using System.Text; namespace AutofacDemo1
{
public interface IOutput
{
void Write(string content);
}
}
using System;
using System.Collections.Generic;
using System.Text; namespace AutofacDemo1
{
public class ConsoleOutput : IOutput
{ public void Write(string content)
{
Console.WriteLine(content);
}
}
}
3、创建一个接口IDateWrite及实现类TodayWriter
using System;
using System.Collections.Generic;
using System.Text; namespace AutofacDemo1
{
public interface IDateWriter
{
void WriteDate();
}
}
using System;
using System.Collections.Generic;
using System.Text; namespace AutofacDemo1
{
public class TodayWriter : IDateWriter
{
public IOutput _output;//将输出接口通过构造方法依赖注入
public TodayWriter(IOutput output)
{
this._output = output;
}
public void WriteDate()
{
this._output.Write(DateTime.Today.ToShortDateString());
}
}
}
4、在Program里做注册,依赖实例解析和创建
推荐从生命周期中解析服务,因为从根容器中解析组件(从根容器解析组件,组件的生命周期会和根容器的生命周期一致,迟迟得不到dispose,造成内存泄漏),有可能会导致内存泄露
using Autofac;
using System; namespace AutofacDemo1
{
class Program
{
//创建一个容器属性,待会儿我们会用到
private static IContainer Container { get; set; }
static void Main(string[] args)
{
Console.WriteLine("Hello Autofac!");
//ContainerBuilder容器创建对象
var builder = new ContainerBuilder();
//做相关的依赖注册
builder.RegisterType<ConsoleOutput>().As<IOutput>();
builder.RegisterType<TodayWriter>().As<IDateWriter>();
//ContainerBuilder的Build()方法可以创建容器
Container = builder.Build(); WriteDate();
}
//生命周期作用域 //生命周期作用域是可释放的并且追踪组件的释放, 因此确保你总是调用了 “Dispose()”" 或者把它们包裹在 “using” 语句
public static void WriteDate()
{
//调用 BeginLifetimeScope() 方法来创建另一个生命周期作用域
using (var scope = Container.BeginLifetimeScope())
{
//用生命周期作用域解析获取IDateWriter对应的依赖对象实例
var writer = scope.Resolve<IDateWriter>();
writer.WriteDate();
}
}
}
}
5、执行过程解读
- WriteDate方法创建一个生存周期期作用域,从中可以解析依赖项。它这样做是为了避免任何内存泄漏-如果IDateWriter或其依赖项是一次性的,那么在释放作用域时,它们将自动被释放。
- WriteDate方法从生存期范围手动解析IDateWriter。
- Autofac看到IDateWriter映射到TodayWriter,因此开始创建TodayWriter
- Autofac发现TodayWriter在其构造函数中需要一个IOutput。(这是“构造函数注入”。)
- Autofac看到IIOutput映射到ConsoleOutput,因此创建一个新的ConsoleOutput实例。
- Autofac使用新的ConsoleOutput实例来完成构建TodayWriter。
- Autofac返回完全构造的TodayWriter供WriteDate使用。
- 对writer.WriteDate()的调用转到全新的TodayWriter.WriteDate()
- 释放Autofac生命周期作用域。在该生命周期作用域解析的项目也将被释放回收
AutoFac学习Demo1——官网Demo的更多相关文章
- Java 银联支付官网demo测试及项目整合代码
注:原文来源与 < Java 银联支付官网demo测试及项目整合代码 > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...
- jqgrid--api,官网demo,编辑
api参考: http://blog.csdn.net/hurryjiang/article/details/7551477 官网demo: http://www.trirand.com/blog/j ...
- webpack官网demo起步中遇到的问题
在webpack官网demo一开始搭建中
- SpringBoot使用JSP(官网Demo)
最开始接触java的时候,前端页面基本都是用jsp来写,最近公司项目要使用SpringBoot重构,查看SpringBoot文档,发现SpringBoot不建议使用JSP,因为jsp在使用内嵌serv ...
- 苹果官网 demo The Elements 阅读随笔
The Elements https://developer.apple.com/library/ios/samplecode/TheElements/Introduction/Intro.html# ...
- 学习 altera官网 之 timequest
1.如果启动沿(launch)和锁存沿(latch)是同一时钟域则,latch比launch晚一个时钟周期. 2.数据到达时间 3.时钟到达时间.如果启动沿(launch edge)和锁存沿(latc ...
- pytorch 迁移学习[摘自官网]
迁移学习包含两种:微调和特征提取器. 微调:对整个网络进行训练,更新所有参数 特征提取器:只对最后的输出层训练,其他层的权重保持不变 当然,二者的共性就是需要加载训练好的权重,比如在ImageNet上 ...
- Datatable 导出到execl 官网demo
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...
- 学习ceph官网的ceph块设备命令(一)
一)存储池命令 1.列出存储池 #ceph osd lspools #ceph osd pool ls 2.创建存储池 # ceph osd pool create yhcpool 512 pool ...
- knockout——官网demo
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
随机推荐
- 搞懂TVS管,有这篇文章就够了
摘要:本文主要介绍TVS的工作原理.关键参数和选型. TVS(Transient Voltage Suppressors,瞬态电压抑制器)又称雪崩击穿二极管,是一种高效电路保护器件,主要是保护电路不受 ...
- SQL注入之布尔盲注
SQL注入之布尔盲注 一.布尔盲注原理 布尔盲注是一种基于布尔逻辑的SQL注入攻击技术,其核心原理是通过构造特定的SQL查询语句,利用应用程序对查询结果的不同响应(通常是真或假)来逐步推断数据库中的信 ...
- 赶上AI的大潮:在VSCode中使用DeepSeek编程的极简方法
1 赶上AI的大潮:在VSCode中使用DeepSeek编程的极简方法 1.1 背景 DeepSeek在春节期间突然大行其道,欣喜国力大增的同时,对于普通IT工作者,如何才能享受这一波AI红利,让 ...
- 莫托曼机器人GP110B操作手柄故障维修全攻略
莫托曼机器人GP110B操作手柄故障机器人维修全攻略 一.前言 莫托曼机器人GP110B操作手柄是机器人控制系统的重要组成部分,它允许操作人员对机 ...
- Linux编写一个自己的命令
Linux编写一个自己的命令 编译一个.c文件,生成可执行文件out.out只有在当前目录下可以执行. 而命令可在任何路径执行 想让out可以在任意路径执行,有以下两种办法 1.将执行文件添加到 /b ...
- D pid(16916) tid(19140) 14:05:45 EdgeSnapFeature::PostExitSizeMove: WM_TWINVIEW_SHOW_GRIDLINES -> off
D pid(16916) tid(19140) 14:05:45 EdgeSnapFeature::PostExitSizeMove: WM_TWINVIEW_SHOW_GRIDLINES -> ...
- spring官宣接入deepseek,真的太香了~
写在前面 经常逛Spring官网(https://docs.spring.io/spring-ai/reference/api/chat/deepseek-chat.html)的小伙伴会发现, Spr ...
- autMan奥特曼机器人-出现argument list too long报错的解决方法
当你运行一段时间autMan后,可能会出现argument list too long的报错,那是你主机系统限制了autMan运行插件的参数长度,导致的报错,如下: 查看当前ARG_MAX的值 在 L ...
- CF2067D Object Identification
CF2067D - Object Identification 题目大意 有一个对你公开的 \(x\) 数组和一个对你隐藏的 \(y\) 数组,保证没有任何两个相同的 \(\{x_i, y_i\}\) ...
- C#/.NET/.NET Core技术前沿周刊 | 第 28 期(2025年2.24-2.28)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...