WPF 手撸插件 八 依赖注入

news2024/9/22 0:59:56

本文内容大量参考了: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
    {
        // 私有静态实例,‌初始时为null
        private static Singleton instance = null;

        // 私有构造函数
        private Singleton() { }

        // 公共静态方法,‌提供全局访问点
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }

}

输出结果如下图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Halcon 深度学习 分类预处理

文章目录 read_dl_dataset_classification 产生一个深度学习数据集算子split_dl_dataset 将样本分为训练、验证和测试子集create_dl_preprocess_param 使用预处理参数创建字典preprocess_dl_dataset 预处理DLDataset中声明的整个数据集write_dict 写入字典文件find_dl_samples …

[网络]TCP/IP五层协议之应用层,传输层(1)

文章目录 一. 应用层二. 传输层端口号传输层的协议UDPTCPTCP报头TCP协议的核心机制 一. 应用层 应用层是和应用程序直接相关, 和程序猿打交道最多的一层 应用层协议, 里面描述的内容, 就是你写的程序, 通过网络具体按照啥样的形式来传输数据 不同的应用程序, 就可以用不同的应…

PHP 使用Spreadsheet写excel缓存导致内存不断增加

这里写自定义目录标题 问题描述问题解决 问题描述 新增了 Spreadsheet 用于写 excle 文件。 从网上查找一些实例后&#xff0c;封装成 createExcelFormData 函数如下&#xff1a; /*** brief 按照指定的键&#xff0c;将 array2(关联数组) 合并到 array1(关…

【C#】VS插件

翻译 目前推荐较多的 可以单词发言&#xff0c;目前还在开发阶段 TranslateIntoChinese - Visual Studio Marketplace 下载量最高的(推荐) Visual-Studio-Translator - Visual Studio Marketplace 支持翻译的版本较多&#xff0c;在 Visual Studio 代码编辑器中通过 Googl…

YOLOV8实现小目标检测

YOLOV8小目标检测 前言&#xff1a;&#xff1a; yolo版出现很多&#xff0c;基本大同小异 但是这些差异让我们考虑在实验中使用哪个版本会比较好&#xff01; 在对小目标检测的过程中&#xff0c;yolov7相比yolov8性能更加好。 如果我们还是想使用yolov8&#xff0c;也是可以实…

大模型获利「攻略」浮出水面!ToC 蓬勃发展,ToB 蕴含奥秘

前言 自去年引发“百模大战”&#xff0c;到近日开启“行业价格战”&#xff0c;中国大模型行业迈入了新的发展阶段。在近期的智源大会上&#xff0c;众多专家分享了对大模型发展现状的见解。结合 IDC 近期发布的大模型实测报告以及 Scale AI 的“AI 就绪报告”&#xff0c;大…

热榜:24年秋招没有金九银十?地信应届生想就业,如何入场?

秋招的“金九银十”即将结束&#xff0c;你的秋招到哪一步了&#xff1f; 是早已收获满满offer&#xff0c;还是仍然在海投面试中&#xff0c;亦或者根本没开始呢&#xff1f; 2024年的就业环境到底如何&#xff1f;上周&#xff0c;“2024年的就业环境到底如何&#xff1f;”…

LeetCode(04) 最接近的三数之和 【双指针】

题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 解题思路 首先进行数组排序&#xff0c;时间复杂度 O(nlogn)&#xff1b;在…

花3000元自学AI大模型后,她薪水涨了20%

“我看到了一个充满无限可能的新世界”&#xff0c;在面试完AI产品经理这一岗位后&#xff0c;陈漫在社交平台上如此描述自己的感受。 AGI大模型浪潮席卷全球&#xff0c;技术革新越是凶猛&#xff0c;人们的失业焦虑便越加强烈。为了应对AI带来的冲击&#xff0c;有些人决定“…

c++—多态【万字文章】

目录 C—多态1.多态的概念2.多态的定义及实现2.1多态的构成条件2.2虚函数的重写2.2.1虚函数重写的两个例外&#xff1a;2.2.1.1协变2.2.1.2析构函数的重写 2.3 c11的override和final2.3.1final2.3.2override 2.4 重载、重写、重定义的对比 3.抽象类3.1抽象类的概念3.2接口继承和…

组件上的v-model(数据传递),props验证,自定义事件,计算属性

一.props验证 在封装组件时对外界传递过来的props数据进行合法性校验&#xff0c;从而防止数据不合法问题。 1.基础类型检查 String,Number,Boolean,Array,Object,Date,Function,Symbol 2.多个可能的类型 3.必须项校验 4.属性默认值 5.自定义验证函数 <template>&…

CAD2020安装方法

文章目录 下载安装包打开压缩包打开文件夹打开CAD2020文件夹双击运行Setup.exe点击安装选择我接受 点击下一步路径默认点击安装等待加载完成安装完成点击立即启动点击OK点击输入序列号点击我同意点击激活输入序列号和 产品钥密点击下一步选择我具有 Autodesk 提供的激活码以管理…

【北京迅为】《STM32MP157开发板使用手册》- 第二十八章Cortex-M4外部中断实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

SRT3D: A Sparse Region-Based 3D Object Tracking Approach for the Real World

基于区域的方法在基于模型的单目3D跟踪无纹理物体的复杂场景中变得越来越流行。然而&#xff0c;尽管它们能够实现最先进的结果&#xff0c;大多数方法的计算开销很大&#xff0c;需要大量资源来实时运行。在下文中&#xff0c;我们基于之前的工作&#xff0c;开发了SRT3D&…

一、轻松部署的大模型开发平台dify.ai

一、轻松部署的大模型开发平台dify.ai 今天学习了大模型&#xff0c;顺便介绍的是一个名为dify.ai的神奇平台&#xff0c;它能让你轻松部署和使用大模型&#xff0c;即使你是编程小白也不用担心。 官网&#xff1a;https://dify.ai/zh 什么是大模型&#xff1f; 首先&#…

C++ nullptr 和NULL的区别

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 概念概述&#xff1a; 在C中&#xff0c;nullptr 和 NULL 都是用来表示空指针&#xff0c;但它们之间有一些重要的区别&#xff1a; nullptr和NULL之间的区分…

ceph简介

ceph存储简要概述&#xff1a; 通过将文件分解成固定大小对象&#xff0c;然后存放于pool中&#xff0c;每个pool中 可包含多个pg&#xff0c;每个pg中又可包含多个osd 通过crush算法 最终数据落盘到osd中去。 一、ceph 删除osd 步骤1 修改osd数据操作权重值 ceph osd crush r…

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.什么是贪心算法 与其说是…

C++ | Leetcode C++题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<string> readBinaryWatch(int turnedOn) {vector<string> ans;for (int i 0; i < 1024; i) {int h i >> 6, m i & 63; // 用位运算取出高 4 位和低 6 位if (h < 12 &&a…

如何在算家云搭建MindSearch(智能搜索)

一、MindSearch简介 MindSearch是一款由上海人工智能实验室书生浦语团队提出了 MindSearch&#xff08;思索&#xff09;框架&#xff0c;旨在提供高效、精准的信息检索服务&#xff0c;能够在 3 分钟内主动从 300 网页中搜集整理有效信息&#xff0c;总结归纳&#xff0c;解决…