一、什麼是依賴注入(DI)?
依賴注入是一種面向對象設計技巧。通過將對象的依賴關係移動到需要依賴它們的對象的構造函數中,DI讓對象更加解耦,使得軟體更容易維護、測試和重用。
二、什麼是控制反轉(IoC)?
控制反轉是依賴注入背後的原則。它可以被解釋為創建對象的過程被反轉了。傳統上,在應用程序中,對象是通過直接調用其構造函數或工廠方法來創建的。而在IoC容器中,創建過程由容器控制,它在需要時主動嚮應用程序提供所需的對象。
三、IoC容器的兩種類型
IoC容器可以分為兩種類型:
1、外部容器:外部容器是一些可用的IoC容器,如Autofac、Unity、StructureMap等。外部容器提供了一個依賴管理體系,可以用來管理企業系統中的所有依賴。在使用外部容器時,需要將容器框架添加到項目中,並編寫配置文件以註冊依賴。
2、內部容器:內部容器是應用程序自身實現的依賴注入容器。ASP.NET Core中的IServiceProvider是一個內部容器,它可以通過添加依賴關係服務來註冊依賴項,並通過構造函數注入。
四、使用依賴注入和控制反轉的好處
1、減少了代碼的耦合,使得應用程序的可測試性更好。
2、依賴注入也可以實現AOP,讓代碼更具可擴展性。
3、使用IoC容器可以管理對象的實例化和生命周期,提高了代碼的復用性。
4、使用IoC容器可以更容易地實現非線性依賴關係。
5、能夠將一些配置、數據等信息集中管理,提高應用整體性能。
五、.NET Core中的依賴注入
ASP.NET Core中使用Microsoft.Extensions.DependencyInjection命名空間來實現依賴注入。ServiceProvider是默認的Ioc容器。
using Microsoft.Extensions.DependencyInjection; public class Program { public static void Main(string[] args) { var serviceProvider = new ServiceCollection() .AddScoped() .AddTransient() .BuildServiceProvider(); var foo = serviceProvider.GetService(); foo.DoSomething(); } } public interface IFoo { void DoSomething(); } public class Foo : IFoo { private readonly IBar _bar; public Foo(IBar bar) { _bar = bar; } public void DoSomething() { Console.WriteLine("Foo is doing something"); _bar.DoSomethingElse(); } } public interface IBar { void DoSomethingElse(); } public class Bar : IBar { public void DoSomethingElse() { Console.WriteLine("Bar is doing something else"); } }
六、ASP.NET Core中的依賴注入
ASP.NET Core內置的依賴注入功能用來處理不同類之間的依賴項關係,並對所有服務的生命周期進行管理。
以下是ASP.NET Core項目中使用DI的示例:
services.AddScoped<IFooService, FooService>();
上面的代碼片段將服務(IFooService)和它的實例(FooService)註冊到容器中,這個服務在需要的地方都可以被使用。
七、.NET Core中的生命周期
.NET Core中有三種生命周期:
1、Singleton:單例模式,創建一個對象實例並將其重用。
2、Scoped:創建一個對象實例並將其重用,但在每個HTTP請求處理期間都是唯一的。
3、Transient:在每次請求時都生成一個新的對象實例。
以下代碼示例說明了一些不同的生命周期:
services.AddSingleton<IFooService, FooService>(); services.AddScoped<IBarService, BarService>(); services.AddTransient<IBazService, BazService>();
八、小結
依賴注入和控制反轉是設計良好的面向對象程序設計的重要工具。.NET Core中的依賴注入提供了一種易於使用、強大而靈活的依賴注入框架。無論是使用內部容器還是外部容器,使用依賴注入將提高您的代碼的可測性和擴展性。
原創文章,作者:KEBV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143913.html