首页 > 其他分享 >.net core di 一对多的方式

.net core di 一对多的方式

时间:2024-02-22 15:48:17浏览次数:20  
标签:core Console di void writers WriteLine AddSingleton net public

using Microsoft.Extensions.DependencyInjection;
using System;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello DI IOC!");
            var provider = new ServiceCollection()
                .AddSingleton<MessagePrinter>()
                //.AddSingleton<IWriter, ConsoleWriter>()
                .AddSingleton<ConsoleWriter>()
                .AddSingleton<TextWriter>()
                //简单工厂模式,针对不同的 key 来获取指定的对象实例
                .AddSingleton(factory => 
                {
                    Func<string, IWriter> accesor = (key) =>
                    {
                        if (key.Equals("Console")) return factory.GetRequiredService<ConsoleWriter>();
                        else if (key.Equals("Text")) return factory.GetRequiredService<TextWriter>();
                        else throw new ArgumentException($"Not Support : {key}");
                    };
                    return accesor;
                })
                .BuildServiceProvider(validateScopes: false);
            var consoleWriter = provider.GetRequiredService<MessagePrinter>();
            consoleWriter.WriteLine();
        }
    }
    public interface IWriter
    {
        void WriteLine();
    }
    public class ConsoleWriter : IWriter
    {
        public void WriteLine()
        {
            Console.WriteLine("ConsoleWriter");
        }
    }
    public class TextWriter : IWriter
    {
        public void WriteLine()
        {
            Console.WriteLine("TextWriter");
        }
    }

    public class MessagePrinter
    {
        private readonly Func<string,IWriter> _writers;
        public MessagePrinter(Func<string, IWriter> writers)
        {
            _writers = writers;
        }

        public void WriteLine()
        {
            _writers("Console").WriteLine();
            _writers("Text").WriteLine();
        }
    }



}

 

标签:core,Console,di,void,writers,WriteLine,AddSingleton,net,public
From: https://www.cnblogs.com/xiaozhilong/p/18027461

相关文章

  • (自用笔记)Word Embedding原理和Pytorch实现
    参考:(1)从WordEmbedding到Bert模型—自然语言处理中的预训练技术发展史-知乎(zhihu.com)(2)吴恩达深度学习(3)deep_thoughts老师的原理和代码讲解:https://space.bilibili.com/373596439越是底层的特征越是所有不论什么领域的图像都会具备的比如边角线弧线等底层基础特征,越往上......
  • [dotnet-Sec]初探反序列化
    [dotnet-Sec]初探反序列化参考Github上y4✌的开源笔记,狠狠学!环境搭建.NET:5.0IDE:Rider(JB家族)新建项目选择.NETCore(支持跨平台)下的控制台应用程序,然后创建这是接触到的关于dotnet的第一个反序列化demo,使用的是BinaryFormatter生成二进制流//Disablethewarning.#pragma......
  • .Net Core Entity Framework Core 的基础封装
    上篇讲到  c#UnitofWork知识分享时,对于创建DBContext的封装没有讲到,这次分享跟大家publicinterfaceIDbContextFactory{DbContextCreateDbContext(stringconnectionString);}///<summary>///这里实现的思路是根据用户输入的代码来决定链接的是哪个数据库......
  • Css中的display属性linline-block(行内区块元素)的详解和应用
    原文链接:https://www.cnblogs.com/lijinwen/p/5679864.html说inline-block(行内区块元素)之前,先说下他另外的2个兄弟display:inline;内联元素,简单来说就是在同一行显示。他没有高度,给内联元素设置width和height是没效果的。display:block;块级元素,简单来说就是就是有换行,会换......
  • .net core di ioc
    (DependencyInjection,DI)依赖注入,又称依赖关系注入,是一种软件设计模式,也是依赖倒置原则的一种体现。依赖倒置原则的含义如下上层模块不依赖下层模块。二者都依赖抽象抽象不依赖细节细节依赖抽象依赖注入原则有别于传统的通过关键字new直接依赖下层模块的形式,以第三方容器......
  • LiRank: LinkedIn在2月新发布的大规模在线排名模型
    LiRank是LinkedIn在2月份刚刚发布的论文,它结合了最先进的建模架构和优化技术,包括残差DCN、密集门控模块和Transformers。它引入了新的校准方法,并使用基于深度学习的探索/利用策略来优化模型,并且通过压缩技术,如量化和词表压缩,实现了高效部署。LinkedIn将其应用于Feed、职位推荐和......
  • aardio ide 字体 及设置
    需求aardioide只支持一个字体,英文字体肯定是Fira但是中文字体不好,所以只好将两个字体合并上使用。有教程。但是我发现已经有合并好的,就拿来使用吧放到fonts目录里面代码importide;ide.setConfig("editor_font_name","FiraFZHMedium");资料教程完美字体合并教程/中......
  • Qt 颜色对话框QColorDialog弹出时应用程序输出栏出现QWindowsWindow::setGeometry: Un
    引言在项目中点击按钮,弹出颜色选择对话框,但同时应用程序会在应用程序输出一栏中显示QWindowsWindow::setGeometry:Unabletosetgeometry180x30+345+311(frame:202x86+334+266)onQWidgetWindow/"QColorDialogClassWindow"on"\\.\DISPLAY1".Resultinggeometry:5......
  • 改造Aforge.Video在.NetCore中使用
    Aforge.Video是可以方便获取摄像头等视频输入设备图像的轻量级组件,但是该组件的最新版本2.2.5大约是在2013年发布的,仅支持.NetFramework,在基于.Net6的Winform中无法使用。Aforge.Video组件存在开源项目AForge.NET中,该项目有1kStars(2024.02)。本文的改造思想是将项目中使......
  • C#以及.Net问题合集
    静态成员(静态方法、静态属性等)不属于类的任何个体对象,它们属于类本身。因此,不能通过实例化的对象来调用静态方法。而应该直接通过类名来调用静态成员,如下:```csharpCalculator.Report();```反过来,非静态方法(如`Add`和`Sub`方法)则需要通过实例化的对象来调用。如下:```csharpCal......