首页 > 编程语言 >c# .net 多类实现同一个接口,动态指定使用哪一个类的实现

c# .net 多类实现同一个接口,动态指定使用哪一个类的实现

时间:2022-12-15 18:14:48浏览次数:53  
标签:logger string c# serviceProvider 实现 var using net public

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Runtime.CompilerServices;
using static System.Net.Mime.MediaTypeNames;

namespace WebApplication3
{
    public interface IBase<T>
    { 
        T GetSelf();
    }
    public interface ITool: IBase<ITool>
    {
        string MethorName();
        
    }
    public class Base<T> : IBase<T>
    {
        private readonly IServiceScopeFactory _serviceScopeFactory;
        public Base(IServiceProvider serviceProvider) {
            _serviceScopeFactory = serviceProvider.GetRequiredService<IServiceScopeFactory>();
        }
        public T GetSelf()
        {
            using (var scope = _serviceScopeFactory.CreateScope())
            {
                var enumerable = scope.ServiceProvider.GetRequiredService<IEnumerable<T>>();
                string name = RedisHelper.Get("TypeName");
                var iTool = enumerable.Where(m => m.GetType().Name == name).FirstOrDefault() ?? enumerable.First();
                return iTool;
            }
        }
    }
    public class  Stool: Base<ITool>, ITool
    {
        public Stool(IServiceProvider serviceProvider) : base(serviceProvider)
        {
        }
        public string MethorName()
        {
           
            return "Stool";
        }
     
    }
    public class Rtool : Base<ITool>,ITool
    {
        public Rtool(IServiceProvider serviceProvider) : base(serviceProvider)
        {
        }
        public string MethorName()
        {
            return "Rtool";
        }

       
    }
}
using Microsoft.AspNetCore.Mvc;

namespace WebApplication3.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;
       
        private readonly ITool _tool;
        public WeatherForecastController(ILogger<WeatherForecastController> logger, ITool tool)
        {
            _logger = logger;
            _tool= tool.GetSelf();
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogWarning("MethorName=" + _tool.MethorName());
        
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
namespace WebApplication3
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();

            builder.Services.AddScoped<ITool, Stool>();
            builder.Services.AddScoped<ITool, Rtool>();
            var csredis = new CSRedis.CSRedisClient($"127.0.0.1:6379,defaultDatabase=1,prefix=test:");
            RedisHelper.Initialization(csredis);
            var app = builder.Build();

            // Configure the HTTP request pipeline.

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

 

标签:logger,string,c#,serviceProvider,实现,var,using,net,public
From: https://www.cnblogs.com/lkd3063601/p/16985737.html

相关文章

  • c++ 类型转换
    string转int可以使用std::stoi,std::stol,std::stoll来转换。intstoi(conststd::string&str,std::size_t*pos=nullptr,intbase=10);参考:h......
  • Docker基础
    一、Docker概述1、Docker的概念•Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源•Docker是在Linux容器里运行应用的开源工具,是一种轻量级......
  • 30分钟带你掌握Alexnet
    今天,我们将介绍深度学习领域的一个著名网络AlexNet。2012年,Hinton的学生AlexKrizhevsky在寝室用GPU死磕了一个DeepLearning模型,一举摘下了视觉领域竞赛ILSVRC桂冠,在百万......
  • .NET Core Hangfire任务计划.NET Core Hangfire任务计划
    .NETCoreHangfire任务计划 安装Hangfire 新建ASP.NETCore空项目,.NetCore版本3.1 往*.csproj添加包引用,添加新的PackageReference标记。如下所示。请注意,下面代码段......
  • 妙啊!纯 CSS 实现拼图游戏
    本文,将向大家介绍一种将多个CSS技巧运用到极致的技巧,利用纯CSS实现拼图游戏。本技巧源自于​​TemaniAfif​​​的CodePen​​CSSOnlyPuzzlegame​​。一款完全......
  • pycharm更改镜像源
    为什么?pycharm安装第三方库时,默认时从官方地址下载安装。但是由于这些镜像源在国外,下载速度一般比较慢,还有可能下载不成功。所以可以将镜像源地址改为国内的地址,这样下载......
  • 瓴羊Quick BI 填报组件让数据分析和可视化呈现轻而易举
    当前,发布了有关应用行业软件的年度报告,里面表示,市场规模在不断扩大,增速也有所提升。瓴羊、帆软等国产的BI商家都在积极成长以满足相关需求。但是BI工具的规划应用只是实现对......
  • springMvc23-配置maven环境和创建maven项目(建议收藏,超全超详细)
    1本次歌谣就对如何创建一个maven项目做一个详细的讲解,毕竟卡了我三天,久久不能入眠,也搜了网上很多的博客都没有顺利的解决maven项目的创建。这篇建议大家收藏,总会用到的。不......
  • ceph 因权重问题导致pgs active+clean+remapped 状态
    1.现象:  2.原因:是因为前期权重调整不合理导致,调整回来就正常了3.操作步骤:cephosdcrushreweightosd.20.98317  # osd位置、权重值  权重值计算=osd磁......
  • Typescript TSConfig
     "references":[  {"path":"modules/xxxx"},  {"path":"modules/xxx"}, ], reference可以提高构建速度 "compilerOptions":{  "paths......