認識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.關注點分離,提高可測試性。