zoukankan      html  css  js  c++  java
  • .NET Core中具有多个实现的依赖注入实现

    0x01 前言

    .NET Core Microsoft依赖注入(DI)非常有用,但是如何处理具有多种实现的接口? 运行时可以基于配置选择这些实现之一吗? 可以反射实现吗?

    0x02 一个接口实现2个类

    接口定义:

    public interface IHelloer
    {
        string SayHello();
    }

    具体实现:

    public class HelloerA : IHelloer
    {
        public string SayHello()
        {
            return $"Hello from {nameof(HelloerA)}";
        }
    }
    
    public class HelloerB : IHelloer
    {
        public string SayHello()
        {
            return $"Hello from {nameof(HelloerB)}";
        }
    }

    依赖注入:

    将HelloerA和HelloerB都注册到DI容器中。

     services.AddTransient<IHelloer, HelloerA>();
     services.AddTransient<IHelloer, HelloerB>();

    刚才我们注册了同一接口的两组实现,那么.Net Core运行时将选择哪种实现?

    完整代码:

    class Program
        {
            static void Main(string[] args)
            {
                IServiceCollection services = new ServiceCollection();
                services.AddTransient<IHelloer, HelloerA>();
                services.AddTransient<IHelloer, HelloerB>();
                var builder = services.BuildServiceProvider();
    
                var message = builder.GetRequiredService<IHelloer>();
                Console.WriteLine(message.SayHello());
            }
        }

    Ctrl+F5 执行后,控制台上会输出:

    Hello from HelloerB

     如上图:结果是HelloerB,这是我们在DI容器中注册的最后一项。 问题来了,如果我想在运行时使用HelloerA,该怎么办?

    实际上,在.NET Core中,当您为一个接口注册多个实现时,可以向构造函数注入该接口的集合,即所有已注册的实现。

     class Program
        {
            static void Main(string[] args)
            {
                IServiceCollection services = new ServiceCollection();
                services.AddTransient<IHelloer, HelloerA>();
                services.AddTransient<IHelloer, HelloerB>();
                var builder = services.BuildServiceProvider();
    
                var message = builder.GetRequiredService<IEnumerable<IHelloer>>();
                Console.WriteLine(message.First().SayHello());
            }
        }

    执行结果

    当然在项目中,我们绝对不能编写这样的硬代码,我们希望通过配置文件选择特定的实现

  • 相关阅读:
    删除表空间的时候遇到的问题:ORA-02429: 无法删除用于强制唯一/主键的索引
    删除
    Activity中使用getSystemService获得系统服务
    用多线程实现反应灵敏的界面(Java)
    用数组实现3个栈之固定分割(Java)
    Android小知识点20条
    Android数据库中数据文件的导出与查看
    MFC中使用CSplitterWnd分割窗口后设置视图大小的问题
    MFC中,通过preCreateWindow函数无法设置视图样式(包括窗口的大小)
    6:Node.js 路由
  • 原文地址:https://www.cnblogs.com/CnKker/p/14277013.html
Copyright © 2011-2022 走看看