WPF 手撸插件 八 依赖注入
本文内容大量参考了:https://www.cnblogs.com/Chary/p/11351457.html 而且这篇文章总结的非常好。
1、注意想使用Autofac,Autofac是一个轻量级、高性能的依赖注入(DI)框架,主要用于.NET应用程序的组件解耦和管理。
核心思想:将对象之间的依赖关系从应用程序中分离出来,以降低代码的耦合度,提高可维护性和可测试性。
主要特点:
轻量级:核心库只有几个DLL文件,易于与其他框架集成,对应用程序性能无影响。
灵活性:提供多种注册方式,如XML配置文件、代码配置和属性注解等。
高性能:在实例化对象时,能比其他DI框架更快地找到并创建所需的依赖项。
生命周期管理:提供多种生命周期管理选项,如瞬态、作用域和单例等。
AOP支持:可轻松与AOP框架集成,实现横切关注点的统一处理。
2、废话结束,我们直接上代码。我安装的是Autofac 3.0.0
2.1、整个官网示例。
using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autofac.Features.Indexed;namespace ConsoleAppAutofac
{class Program{private static IContainer Container { get; set; }static void Main(string[] args){var builder = new ContainerBuilder();//准备容器builder.RegisterType<ConsoleOutput>().As<IOutput>();//注册对象builder.RegisterType<TodayWriter>().As<IDateWriter>();//注册对象builder.RegisterInstance(new Dog());//实例注入builder.RegisterInstance(Singleton.Instance).ExternallyOwned();//将单例对象托管到IOC容器builder.Register(c => new Person() { Name = "张三", Age = 22 }); //Lambda表达式注入builder.RegisterGeneric(typeof(List<>));//注入泛型类builder.RegisterType<Doge>().As<IAnimal>();//映射对象,IAnimal被多次注册,以最后注册为准builder.RegisterType<Cat>().As<IAnimal>().PreserveExistingDefaults();//指定Cat为非默认值,PreserveExistingDefaults()修饰符,可以指定某个注册为非默认值//一个接口被多个实例对象实现,可以进行命名,注入的时候使用名字进行区分builder.RegisterType<Doge>().Named<IAnimal>("doge");builder.RegisterType<Doge>().Named<IAnimal>("pig");//Autofac.Features.Indexed.IIndex<K,V>是Autofac自动实现的一个关联类型。使用IIndex<K,V>作为参数的构造函数从基于键的服务中选择需要的实现builder.RegisterType<Doge>().Keyed<IAnimal>(AnumaType.Doge);//映射对象builder.RegisterType<Pig>().Keyed<IAnimal>(AnumaType.Pig);//映射对象builder.RegisterType<Pig>().Keyed<IAnimal>(AnumaType.Cat);//映射对象//自动装配,从容器中的可用对象中选择一个构造方法来创建对象,这个过程叫做自动装配。它是通过反射实现的,所以实际上容器创造对象的行为比较适合用在配置环境中//Autofac默认从容器中选择参数最多的构造函数。如果想要选择一个不同的构造函数,就需要在注册的时候就指定它://这种写法将指定调用Person(string)构造函数,如该构造函数不存在则报错。builder.RegisterType<Person>().UsingConstructor(typeof(string));//额外的构造函数参数://有两种方式可以添加额外的构造函数参数,在注册的时候和在检索的时候。在使用自动装配实例的时候这两种都会用到。//注册时添加参数,使用WithParameters()方法在每一次创建对象的时候将组件和参数关联起来。List<NamedParameter> pars = new List<NamedParameter>() { new NamedParameter("Age", 20), new NamedParameter("Name", "张三") };builder.RegisterType<Person>().WithParameters(pars);Container = builder.Build();//容器创建完毕List<string> list = Container.Resolve<List<string>>();var dog = Container.Resolve<IAnimal>();//通过IOC容器创建对象dog.SayHello();var pig = Container.ResolveNamed<IAnimal>("pig");//通过IOC容器创建对象pig.SayHello();var animal = Container.Resolve<IIndex<AnumaType, IAnimal>>();var cat = animal[AnumaType.Cat];cat.SayHello();WriteDate();Console.ReadLine();}public static void WriteDate(){using (var scope = Container.BeginLifetimeScope()){var writer = scope.Resolve<IDateWriter>();//通过IOC容器创建对象writer.WriteDate();//调用对象的方法}}}/// <summary>/// 设置枚举/// </summary>public enum AnumaType{Doge,Pig,Cat}public interface IOutput{void Write(string content);}public class ConsoleOutput : IOutput{public void Write(string content){Console.WriteLine(content);}}public interface IDateWriter{void WriteDate();}public class TodayWriter : IDateWriter{private IOutput _output;public TodayWriter(IOutput output){this._output = output;}public void WriteDate(){this._output.Write(DateTime.Today.ToShortDateString());}}public class Dog{public void Say(){Console.WriteLine("汪汪汪");}}public interface IAnimal{void SayHello();}public class Doge : IAnimal{public void SayHello(){Console.WriteLine("我是小狗,汪汪汪~");}}public class Cat : IAnimal{public void SayHello(){Console.WriteLine("我是小猫,喵喵喵~");}}public class Pig : IAnimal{public void SayHello(){Console.WriteLine("我是小猪,呼呼呼~");}}public class Person{ public Person(){}public Person(string name){Name = name;}public Person(string name, int age):this(name){Age = age;}public string Name { get; set; }public int Age { get; set; }}public class Singleton{// 私有静态实例,初始时为nullprivate static Singleton instance = null;// 私有构造函数private Singleton() { }// 公共静态方法,提供全局访问点public static Singleton Instance{get{if (instance == null){instance = new Singleton();}return instance;}}}}
输出结果如下图。
相关文章:

WPF 手撸插件 八 依赖注入
本文内容大量参考了:https://www.cnblogs.com/Chary/p/11351457.html 而且这篇文章总结的非常好。 1、注意想使用Autofac,Autofac是一个轻量级、高性能的依赖注入(DI)框架,主要用于.NET应用程序的组件解耦和…...

走进低代码报表开发(一):探秘报表数据源
在前文当中,我们对勤研低代码平台的流程设计功能进行了介绍。接下来,让我们一同深入了解在企业日常运营中另一个极为常见的报表功能。在当今数字化时代,高效的报表生成对于企业的决策至关重要。勤研低代码开发平台能够以卓越的性能和便捷的操…...

代理服务器及其原理
代理服务器的代理可以分为正向代理和反向代理,本篇将讲解这两种代理方式的原理,以及对应的功能特点和应用场景。最后还对比和 NAT 和代理服务器的区别。 目录 正向代理 工作原理 功能特点 应用场景 反向代理 基本原理 应用场景 NAT和代理服务器…...

计算机毕业设计选题推荐-养老院管理系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

免费SSL证书正在逐渐被淘汰,证书部署自动化的发展趋势即将到来!
目录 背景解决方案。1.使用自签证书(浏览器报警、免费)2.更换支持自签自续的CA机构(免费)3.付费选择CA机构 免费SSL证书正在逐渐被淘汰,证书部署自动化的发展趋势即将到来免费的SSL证书有以下弊端1.有效期短࿱…...
openVX加速-基本概念和简单代码实现
OpenVX 是一个用于计算机视觉和图像处理的跨平台加速标准库,旨在提高在异构平台(如 CPU、GPU、DSP 等)上的执行效率。OpenVX 提供了一组优化的、可移植的 API,用于加速常见的视觉算法,使开发者能够在不同硬件平台上实现…...
网工内推 | 网络工程师,Base上海,HCIP/HCIE认证优先
01 利宏科技 🔷招聘岗位:网络工程师 🔷任职要求 1、有HCIE、HCIP证书 2、做过IDC机房网络建设 3、本科毕业 4、熟悉基本linux命令 5、熟悉山石、华为等防火墙 6、熟悉IPS、WAF等安全设备 7、做过同城灾备机房建设优先 🔷薪…...

Windows10 如何配置python IDE
Windows10 如何配置python IDE 前言Python直接安装(快速上手)Step1.找到网址Step2.选择版本(非常重要)Step3. 安装过程Step4. python测试 Anaconda安装(推荐,集成了Spyder和Pycharm的安装)Step1…...

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享
下载链接在博客最底部!! 之前需要参考这本书,但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源,浪费了不少时间,在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…...
信息学奥赛:青少年编程的高光舞台,通向未来科技的敲门砖
近年来,信息学奥林匹克竞赛(NOI,National Olympiad in Informatics)逐渐成为众多中学生学习编程、展示才华的热门赛事。这项被誉为“编程天才选拔赛”的竞赛,不仅考验学生的编程能力、算法思维,更是通向名校…...
Android - NDK:在Jni中打印Log信息
在Jni中打印Log信息 1、在配置CMakeLists.txt find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You # can link…...
websocket协议解说
WebSocket是一种在单个TCP连接上进行全双工通信的协议。 它为客户端和服务器之间提供了一个持久的连接,允许数据以帧的形式在客户端和服务器之间进行双向传输。 WebSocket协议特别适合需要实时通信的应用,如在线聊天、实时游戏、股票交易、实时监控系统…...
InternVL2-多模态模型原理-多模态模型和组合模型
好的,我会尽量用简单易懂的语言来解释InternVL和InternVL 1.5的工作原理。 InternVL和InternVL 1.5的工作原理 1. 模型结构 InternVL和InternVL 1.5都是由两个主要部分组成:一个视觉模型和一个语言模型。 视觉模型:负责处理图片信息。它的…...

大语言模型之ICL(上下文学习) - In-Context Learning Creates Task Vectors
本文译自 《In-Context Learning Creates Task Vectors》 —— 论文中的作者也在用LLaMA模型,笔者自我感觉拉近和世界顶级人才的距离,哈哈内容较长,如想看结论直接看 摘要、介绍与结论几个章节即可,看细节请看目录索引。经验风险最…...
出现错误消息“ sshd[xxxx]: error: no more session ”的原因是什么?
环境 • 红帽企业 Linux 6 • Red Hat Enterprise Linux 7 • openssh 问题 • SSH 选项的用途是什么MaxAuthTries,MaxSessions和MaxStartups? 解决 MaxAuthTries :指定每个连接允许的最大身份验证尝试次数。一旦失败次数达到此值的一半&…...
代码随想录训练营第29天|控制变量
134. 加油站 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int cur0, total0, start0;for(int i0; i<gas.size(); i){curgas[i]-cost[i];totalgas[i]-cost[i];if(cur<0){starti1;cur0;}}if(start>gas…...

毕业论文选题难?5招帮你轻松搞定选题!
AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 你是不是已经为毕业论文的选题愁得头发都要掉光了?每次打开文档,都觉得什么都想写,又好像什么都写不了。选题看起来很简单,但真正开始动手的时候,…...

[QT]记事本项目(信号槽,QT基础控件,QT文件操作,QT关键类,对话框,事件)
一.UI界面搭建 (ui界面使用,界面布局,各控件介绍,界面大小调整) 二.信号槽机制实现文件的打开,保存,退出 (信号槽,QFile文件类,QTextStream类,QFileDialog文件对话框࿰…...

redis基本数据结构-hash
这里写自定义目录标题 1. redis的数据结构hash1.1 Hash 数据结构的特点1.2 常见命令1.3 适用示例 2. 常见业务场景2.1 用户信息存储2.1.1 场景2.1.2 优势2.1.3 解决方案2.1.4 代码实现 2.2 购物车管理2.2.1 背景2.2.2 优势2.2.3 解决方案2.2.4 代码实现 3. 注意事项:…...
21. 什么是MyBatis中的N+1问题?如何解决?
N1 问题是指在进行一对多查询时,应用程序首先执行一条查询语句获取结果集(即 1),然后针对每一条结果,再执行 N 条额外的查询语句以获取关联数据。这个问题通常出现在 ORM 框架(如 MyBatis 或 Hibernate&…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...