依赖注入
注入方法 | 方法说明 |
---|---|
AddTransient | 每次service请求都是获得不同的实例,暂时性模式 |
AddScoped | 对于同一个请求返回同一个实例,不同的请求返回不同的实例,作用域模式 |
AddSingleton | 每次都是获得同一个实例, 单一实例模式 |
MVC控制器的DI
-
构造函数输入
-
创建接口
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; } }
-
-
使用
FromServices
注入public IActionResult About([FromServices] IDateTime dateTime) { return Content( $"Current server time: {dateTime.Now}"); }
-
控制器访问控制
-
创建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
-
服务注册
方法 自动释放 多种实现 传递参数 AddSingleton<IMyDep, MyDep>(); 是 是 否 AddSingleton (sp => new MyDep(99)); 是 是 是 AddSingleton (); 是 否 否 services.AddSingleton (new MyDep(99)); 否 是 是 services.AddSingleton(new MyDep(99)); 否 否 是 -
构造函数注册
-
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) 从服务提供程序中检索给定类型的实例。 如果找不到该实例,则直接实例化
-