DI & IoC

認識DI與Ioc

早期A物件需要用到B物件時,則在A物件裡new一個B物件,AB物件有依賴關係,當任一物件修改時,則另一個物件也可能需要修改。

因此有了IoC及DI解耦的設計思維。

DI與IOC關係:

IoC(Inversion of Control)控制反轉,將控制權轉交給第三方容器。

DI(Dependency Injection)依賴注入,是實現IoC行為之一,將被依賴的物件注入到第三方容器中。

上述所謂的第三方容器稱為DI Container,以往專案使用到DI都需要安裝DI Container(Unity、Autofac…等等)。

至.NetCore開始有提供內建的DI Container,Microsoft.Extensions.DependencyInjection ,也可用於.NET Framework,但只能用建構子注入。

ASP.NET 5 Composition root 是寫在Startup.cs的ConfigureService裡。 

 public class Startup
 {
       // This method gets called by the runtime. Use this method to add services to the container.
       public void ConfigureServices(IServiceCollection services)
       {           
           services.AddSingleton<IClassA, ClassA>();
       }
 }

建構子注入

 public class HomeController : Controller
 {
       private readonly IClassA _classA;
       public HomeController(IClassA classA)
       {
           _classA = classA;
       }
 }

本來AB物件互相依賴耦合,現在變成依賴DI,而當B物件需要抽換成C物件時,A物件可以不用更改。

DI好處:

1. 低耦合,高內聚。

2.降低邏輯變更造成改動程式碼的幅度。

3.關注點分離,提高可測試性。