通过上面这张图不丢脸出IoC在个中起到的浸染。
未利用前: 全体程序相互依赖,当新的需求被提出时,牵一发而动全身,这是我们最不想看到的,在小项目中还能理清关系,当需求越来越多,切实其实不可想象。
开始利用: 在引入第三方后,各个模块之间没有耦合关系,将依赖降至最低,所有掌握都通过IoC集中掌握。
利用后: 为了方便不雅观察把中间的IoC容器拿掉后,可以看出各个模块之间已经没有耦合关系,修正单一模块后,再也不须要考虑其他模块。

三种依赖注入办法1.布局器注入

布局器注入便是在布局函数中借助参数将依赖的工具注入由他创建的工具当中。
平时基本都是利用个中的布局函数办法实现注入。

public class A { public IB B { get; } public A(IB b) => B = b; }

ASP.NET Core 中的利用

aspnethtml注入ASPNET Core 进修笔记 第二篇 依附注入 RESTful API

[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; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet] public IEnumerable<WeatherForecast> Get() { var rng = new Random(); return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }) .ToArray(); } }2.属性注入

通过标注InjectionAttribute特性的办法可以将属性设置为自动注入的依赖属性。

public class A { public IB B { get; set; } [Injection] public IC C { get; set; } }3.方法注入

同样通过标注InjectionAttribute特性的办法可以将该方法标注为注入方法。

public class A { public IB B { get; } [Injection] public Initialize(IB b) => B = b; }

除了通过容器初始化做事过程中自动调用实现,我们还可以利用它实现另一种更加自由的方法注入,这种办法在ASP.NET Core中广泛运用。
在ASP.NET Core启动时会调用Startup工具完成中间件注册,而定义Startup类型时候不须要让它实现某个接口,以是注册Configure方法没有一个固定声明,但可以通过下面方法将任意依赖做事注册到这个方法当中。

public class Startup { public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1")); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }生命周期

AddSingleton的生命周期: 项目启动-项目关闭 相称于静态类 只会有一个AddScoped的生命周期: 要求开始-要求结束 在这次要求中获取的工具都是同一个AddTransient的生命周期: 要求获取-(GC回收-主动开释) 每一次获取的工具都不是同一个把稳:由于AddScoped工具是在要求的时候创建的,以是不能在AddSingleton工具中利用,乃至也不能在AddTransient工具中利用。
权重: AddSingleton→AddTransient→AddScoped

ASP.Net Core 中自带的注入

public void ConfigureServices(IServiceCollection services) { services.AddScoped<IA, A>; services.AddSingleton<IB, B>; services.AddTransient<IC, C>; services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" }); }); }

把稳: ASP.Net Core中的注入还是比较大略的,但是当做事变得越来越多时,手动注入就比较麻烦了,后续再先容其他IoC框架。

原文地址:https://www.cnblogs.com/gurenyumao/p/15348454.html