ASP.NET Core Web (三) 依赖注入

依赖注入

注入方法 方法说明
AddTransient 每次service请求都是获得不同的实例,暂时性模式
AddScoped 对于同一个请求返回同一个实例,不同的请求返回不同的实例,作用域模式
AddSingleton 每次都是获得同一个实例, 单一实例模式
MVC控制器的DI
  1. 构造函数输入

    • 创建接口

      public interface IDateTime
      {
          DateTime Now { get; }
      }
      
    • 实现接口

      public class SystemDateTime : IDateTime
      {
          public DateTime Now
          {
              get { return DateTime.Now; }
          }
      }
      
    • 添加到容器

      services.AddSingleton<IDateTime, SystemDateTime>();	
      
    • Controller调用

      public class HomeController : Controller
      {
          private readonly IDateTime _dateTime;
          // 引用单例
          public HomeController(IDateTime dateTime)
          {
              _dateTime = dateTime;
          }
      }
      
  2. 使用FromServices 注入

    public IActionResult About([FromServices] IDateTime dateTime)
    {
        return Content( $"Current server time: {dateTime.Now}");
    }
    
  3. 控制器访问控制

    • 创建entity类

      public class SampleWebSettings
      {
          public string Title { get; set; }
          public int Updates { get; set; }
      }
      
    • 配置类添加到服务集合

      services.Configure(Configuration);

    • 从 JSON 格式文件中读取设置

      Host.CreateDefaultBuilder(args)
                  .ConfigureAppConfiguration((hostingContext, config) =>
                  {
                      config.AddJsonFile("samplewebsettings.json",
                          optional: false,
                          reloadOnChange: true);
                  })
                  .ConfigureWebHostDefaults(webBuilder =>
                  {
                      webBuilder.UseStartup<Startup>();
                  });
      
    • 使用

      public class SettingsController : Controller
      {
          private readonly SampleWebSettings _settings;
      
          public SettingsController(IOptions<SampleWebSettings> settingsOptions)
          {
              _settings = settingsOptions.Value;
          }
      
          public IActionResult Index()
          {
              ViewData["Title"] = _settings.Title;
              ViewData["Updates"] = _settings.Updates;
              return View();
          }
      }
      
.NET Core的DI
  1. 服务注册

    方法 自动释放 多种实现 传递参数
    AddSingleton<IMyDep, MyDep>();
    AddSingleton(sp => new MyDep(99));
    AddSingleton();
    services.AddSingleton(new MyDep(99));
    services.AddSingleton(new MyDep(99));
  2. 构造函数注册

    • IServiceProvider

      public class ProductService
      {
          // 声明需要注入的类
          private readonly IProductRepository _productRepository;
          private readonly IProductService _productService;
          // 构造函数中获得serviceProvider
          public ProductService(IServiceProvider serviceProvider)
          {
              // serviceProvider通过调用实现注入
             _productRepository = serviceProvider.GetRequiredService<IProductRepository>();  
              _productService = serviceProvider.GetService(typeof(ProductService)) as IProductRepository;
              // 或者
              _productService = serviceProvider.GetService<ProductService, IProductService>();
          }
      }
      
    • ActivatorUtilities

      激活器服务的帮助程序代码

      方法名 说明
      CreateFactory(Type, Type[]) 创建一个委托,该委托将使用直接和/或从 IServiceProvider 提供的构造函数参数实例化类型
      CreateInstance(IServiceProvider, Type, Object[]) 使用直接提供的或从 IServiceProvider提供的构造函数参数实例化类型。
      GetServiceOrCreateInstance(IServiceProvider) 从服务提供程序中检索给定类型的实例。 如果找不到该实例,则直接实例化
posted @ 2023-09-27 15:58  摧残一生  阅读(24)  评论(0编辑  收藏  举报