您现在的位置是:首页 >学无止境 >.NET Core内置依赖注入容器,一个接口多个实现网站首页学无止境

.NET Core内置依赖注入容器,一个接口多个实现

巍巍星火 2025-12-25 00:01:03
简介.NET Core内置依赖注入容器,一个接口多个实现

直接贴代码

1、定一个接口

public interface IHomeService
{
    string GetMessage();
}

2、定义2个实现

//实现A
public class HomeServiceA : IHomeService
{
    public string GetMessage()
    {
        return typeof(HomeServiceA).Name;
    }
}
//实现B
 public class HomeServiceB : IHomeService
 {
     public string GetMessage()
     {
         return typeof(HomeServiceB).Name;   
     }
 }

3、注册服务(核心),根据类型类型判定返回不同的服务

  //我这里使用里扩展方法,将服务注册抽离出来。让program看起来更简洁
  public static class IServiceCollectionExtension
  {
      public static void AddServices(this IServiceCollection services)
      {
          services.AddScoped<HomeServiceA>();
          services.AddScoped<HomeServiceB>();
          services.AddScoped<Func<Type, IHomeService>>((serviceProvider) =>
          {
              Func<Type, IHomeService> accessor = key =>
              {
                  if (key == typeof(HomeServiceA))
                      return serviceProvider.GetService<HomeServiceA>();
                  else if (key == typeof(HomeServiceB))
                      return serviceProvider.GetService<HomeServiceB>();
                  throw new ArgumentException($"不支持的DI Key: {key}");
              };
              return accessor;
          });


      }
  }

 4、使用


    [Route("api/[controller]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        
        private readonly IHomeService _homeService;
        public HomeController(Func<Type,IHomeService> func)
        {
           //假设我要HomeServiceA实现这里就这么写;如果要HomeServiceB实现,将这里的A改为B即可
            _homeService = func(typeof(HomeServiceA));
        }


        [HttpGet]
        public Result GetServiceType()        {          

            //这里是使用测试
            return new Result() { code = 1, message = "成功",data = _homeService.GetMessage() };
          
        }

    }

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。