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

复制代码
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();
        }
    }
}
复制代码

 

posted on   落叶子  阅读(371)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示