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(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现