SlideShare a Scribd company logo
1 of 47
DEPENDENCY INJECTION
in ASP.NET CORE
2016/8/19
S.O.L.I.D
HIGH COHESION & LOW COUPLING
1.物件導向設計原則
1
2
單一責任原則:
單一類別單一
責任、低耦合
S
開放(擴充)
封閉(修改)
原則:開放擴
充、封閉修改
O
Liskov’s
Substitution
Principle:子
類別必須可以
被父類別所替
換
L
介面設計應符
合特定目的、
易懂、可再用
性高
I
依賴倒轉原則:
不應該讓
High-level
module 依賴
Low-level
components
D
3
 High Cohesion(高內聚):物件或模組內成員的
存在應是為了解決相同問題而彼此緊密合作
 Low Coupling(低耦合):物件或模組之間的相
依性越低,則物件的可重用性越高
高內聚,低耦合,是軟體工程中的概念,主要用以判斷物件導向程式設
計的優劣
High Cohesion & Low Coupling
4
High Coupling
5
High Coupling Low Coupling
6
Low Cohesion
7
Extremely Low Cohesion
8
High Cohesion
9
Low Coupling & High Cohesion
INVERSION OF CONTROL
&
DEPENDENCY INJECTION
2.設計模式
10
11
 IoC (控制反轉):2004 年由 Martin
Fowler 提出,旨在「反轉」程式之間的
控制關係,用以減低程式之間的耦合度
• 讓穩定的程式去依賴不穩定的程式,會因為不穩定的程式容易起變化
而波及穩定的程式
• 傳統上主程式控制著各副程式執行的順序及流程,若副程式常需要變
動,便容易引起不穩定的情況
• 不佳的相依關係,將使變動所引起的影響被放大
12
13
 Dependency Injection(依賴注入):將物
件間的相依關係,利用一些方式依需要從
外部注入到需求物件中,而不必在需求物
件中明確建立相依物件
• Program to an interface, not an implementation!
• 透過將相依關係抽離至抽象層(abstraction layer:
interface, abstract class)來降低各元件之間的耦
合度,讓程式更好維護
14
 某客戶類別只依賴於服務界面,而不依賴於具體的服務類別,故客戶類別
只定義該服務界面的注入點
 在程式執行過程中,客戶類別不直接實做服務類別,而是由客戶類別的執
行環境 Context 或專門模組負責實做服務類別,並將該服務類別由注入點
注入到客戶類別中
講白話:
Builder ClassA
IServiceA
ServiceA
① creates
② uses
③ injects dependencies
15
public class ObjA
{
private IObj obj;
public void ObjA(IObj obj)
{
this.obj = obj;
}
public void SomeAction()
{
obj.DoWork();
}
}
DI 的三種注入方式
1. 建構式注入(Constructor Injection)
類別所需物件由外界透過該類別的公開建構函式傳入。若需要注入 n 個相依物
件,則建構函式通常至少要有 n 個引數,且引數的型別為介面或抽象類別
16
public class ObjA
{
private IObj obj;
public IObj Obj
{
get
{
return this.obj;
}
set
{
this.obj = value;
}
}
public void SomeAction()
{
if (this.obj == null)
{
throw new ArgumentNullException("obj", "obj is null");
}
obj.DoWork();
}
}
public void SomeAction()
{
obj.DoWork();
}
}
2. 屬性注入(Property Injection)
透過物件的屬性來注入相依物件,與「建構式注入」相似,類別本身也需有個
成員變數來保存對相依物件的參考,主要區別:「屬性注入」的時機比「建構
式注入」來得晚,而且外界不一定會設定該屬性
17
public class ObjA
{
public void SomeAction(IObj obj)
{
if (obj == null)
{
throw new ArgumentNullException("obj", "obj is null");
}
obj.DoWork();
}
}
3. 方法注入(Method Injection)
用戶端每次呼叫某物件的方法時都必須透過方法的引數來傳入相依物件
• 提供服務的類別不需在整個類別中使用特定相依物件,而只在用戶端呼叫某
些方法時才需傳入那些物件
• 用戶端每次呼叫特定方法時可能會傳入不同的物件,而這些物件唯一相同之
處是它們都實作了同一個介面(或繼承自同一個抽象類別)
3. .NET Core
18
Mobile First, Cloud First
Open Source
Cross Platform
19
In a press and analyst briefing last year, Microsoft CEO Satya
Nadella put up a slide proclaiming “Microsoft ♥ Linux”.
20
當我們 Core 在一起
21
.NET Framework
APIs
Shared
APIs
.NET Core
APIs
Windows APIs
Windows
Updates
GUI
Architecture
Cross
Platform
GitHub
NuGet
Open Source
22
.NET Core 跨平台
CLI
(命令列介面)
No
System.Web.dll
(Webform out!)
No
Web.Config
(OWIN)
Without IIS
(Kestrel Server)
模組化
(GitHub, NuGet)
project.json
appsettings.json
23
Getting Started
1. Install .NET Core
2. Create a new .NET Core project:
mkdir aspnetcoreapp
cd aspnetcoreapp
dotnet new
24
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
},
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0"
},
"imports": "dnxcore50"
}
}
}
3. Update the project.json file to add the Kestrel HTTP server
package as a dependency:
25
4. Restore the packages:
5. Add a Startup.cs file that defines the request handling logic:
dotnet restore
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
namespace aspnetcoreapp
{
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(context =>
{
return context.Response.WriteAsync("Hello from ASP.NET Core!");
});
}
}
}
26
6. Update the code in Program.cs to setup and start the Web host:
7. Run the app (the command will build the app when
it’s out of date):
using System;
using Microsoft.AspNetCore.Hosting;
namespace aspnetcoreapp
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
dotnet run
dotnet run
27
8. Browse to http://localhost:5000:
28
ASP.NET Core Initialization
4. Dependency Injection
in .NET Core
29
30
• 註冊物件於整個應用程式生命週期內只能實體化一次,適用對
象如:logger
Singleton
• 每次請求均會實體化註冊物件。適用對象如:unit testing
mock objects
Transient
• 註冊物件在每次請求時會被實體化,存活期為請求的作用其間,
在此期間僅能實體化一次。適用對象如:資料存取層
Scoped
.NET Core 內建 DI Container 生命週期模式
31
新增 ASP.NET Core Web Application 專案
32
選擇「Web 應用程式」範本
33
專案結構之容顏
global.json
全域設定檔,用來定義預設要「自動匯入」
到方案檔中的路徑清單與 sdk 的預設版本
project.json
專案設定檔,類似 web.config
Startup.cs
網站啟動檔,類似 global.asax 角色,取
而代之的就是 Startup.cs 檔案裡
的 Startup 類別
34
project.json
MVC 與 Web API 的核心套
件
Hosting
35
小道消息:Microsoft 可能棄
用 project.json 回歸 .csproj
不可靠來源:https://www.infoq.com/news/2016/05/project-json
36
Startup.cs
 ConfigureServices 方法會由 ASP.NET 框架主動呼叫,可在此設定應用程式所需服務(包
括向 DI 容器註冊型別)。此方法傳入之參數 services,型別是 IServiceCollection,它就
是 ASP.NET 5 內建的 DI 容器,可以透過此容器來註冊相依物件的型別對應關係
 IServiceCollection 介面所屬的命名空間是 Microsoft.Extensions.DependencyInjection
37
 Configure 方法有傳入參數 app,型別是 IApplicationBuilder,在此使用
它的 UseMvc 方法來將 MVC/Web API 元件加入至應用程式的管線作業流程,
ASP.NET 框架會在應用程式啟動時主動呼叫此方法
38
Run^2 See!
39
加入 API Controller
40
實做服務類別
41
注入相依物件至 Web API Controller
Constructor
ASP.NET 框架在建立此 controller 物件時,能夠一併注入它需要的 ITimeService 物件
42
Run^2 See…Oops!
43
在 Startup 類別 ConfigureServices 方法中註
冊 ITimeService 型別所對應的實作類別
44
Run^2 See…Yeah!
45
 透過 IServiceCollection 擴充方法 AddScope(why?) 向 ASP.NET DI 容器註
冊型別對應關係(LIFO):當需要 ITimeService 物件時,使用 TimeService
來建立物件實體
 MVC 框架建立 ValuesController 時,偵測到建構函式需要 ITimeService 物
件,便會要求內建 DI 容器提供一個 ITimeService 物件並將此物件傳入
ValuesController 的建構函式
案例回顧
ValueController
+ValueController
(ItimeService)
<<interface>>
ITimeService
+Now():string
+Now():string
TimeService
.NET DI
Container
注入點
(建構式注入)
MVC Framework
creates
uses
injects dependencies
B
y
e

More Related Content

Viewers also liked

Viewers also liked (17)

Difference between wcf and asp.net web api
Difference between wcf and asp.net web apiDifference between wcf and asp.net web api
Difference between wcf and asp.net web api
 
Dapper performance
Dapper performanceDapper performance
Dapper performance
 
ASP.NET MVC 4 - Routing Internals
ASP.NET MVC 4 - Routing InternalsASP.NET MVC 4 - Routing Internals
ASP.NET MVC 4 - Routing Internals
 
Repository design pattern in laravel - Samir Poudel
Repository design pattern in laravel - Samir PoudelRepository design pattern in laravel - Samir Poudel
Repository design pattern in laravel - Samir Poudel
 
C# 6.0 - DotNetNotts
C# 6.0 - DotNetNottsC# 6.0 - DotNetNotts
C# 6.0 - DotNetNotts
 
Day02 01 Advance Feature in C# DH TDT
Day02 01 Advance Feature in C# DH TDTDay02 01 Advance Feature in C# DH TDT
Day02 01 Advance Feature in C# DH TDT
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi Applications
 
WebApp #3 : API
WebApp #3 : APIWebApp #3 : API
WebApp #3 : API
 
Design Pattern For C# Part 1
Design Pattern For C# Part 1Design Pattern For C# Part 1
Design Pattern For C# Part 1
 
.Net Core
.Net Core.Net Core
.Net Core
 
Laravel 5 In Depth
Laravel 5 In DepthLaravel 5 In Depth
Laravel 5 In Depth
 
ASP.NET Core 1.0 Overview
ASP.NET Core 1.0 OverviewASP.NET Core 1.0 Overview
ASP.NET Core 1.0 Overview
 
Software Architecture: Styles
Software Architecture: StylesSoftware Architecture: Styles
Software Architecture: Styles
 
ARCHITECTURAL STYLES
ARCHITECTURAL STYLESARCHITECTURAL STYLES
ARCHITECTURAL STYLES
 
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
Architectural Patterns and Software Architectures: Client-Server, Multi-Tier,...
 
Design Patterns (Examples in .NET)
Design Patterns (Examples in .NET)Design Patterns (Examples in .NET)
Design Patterns (Examples in .NET)
 
Layered Software Architecture
Layered Software ArchitectureLayered Software Architecture
Layered Software Architecture
 

Similar to Dependency injection in asp.net core

Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
Wade Huang
 
第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序
ruandao
 
为10g rac cluster添加节点
为10g rac cluster添加节点为10g rac cluster添加节点
为10g rac cluster添加节点
maclean liu
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
yiditushe
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
appollo0312
 
Node getting-started
Node getting-startedNode getting-started
Node getting-started
lylijincheng
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导
yiditushe
 
Varnish简介
Varnish简介Varnish简介
Varnish简介
fangdeng
 

Similar to Dependency injection in asp.net core (20)

Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Exodus2 大局观
Exodus2 大局观Exodus2 大局观
Exodus2 大局观
 
第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序
 
为10g rac cluster添加节点
为10g rac cluster添加节点为10g rac cluster添加节点
为10g rac cluster添加节点
 
Asp.net mvc 6 新功能初探
Asp.net mvc 6 新功能初探Asp.net mvc 6 新功能初探
Asp.net mvc 6 新功能初探
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.tw
 
ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索ASP.NET MVC 6 新功能探索
ASP.NET MVC 6 新功能探索
 
打開窗,讓大象跨進來 - Microsoft HDInsight
打開窗,讓大象跨進來 - Microsoft HDInsight打開窗,讓大象跨進來 - Microsoft HDInsight
打開窗,讓大象跨進來 - Microsoft HDInsight
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程Struts+Spring+Hibernate整合教程
Struts+Spring+Hibernate整合教程
 
OSGi Small Lab
OSGi Small LabOSGi Small Lab
OSGi Small Lab
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
 
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb
 
Node getting-started
Node getting-startedNode getting-started
Node getting-started
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展
 
Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导Spring框架,技术详解及使用指导
Spring框架,技术详解及使用指导
 
Varnish简介
Varnish简介Varnish简介
Varnish简介
 
Asp.net 5 新功能與變革
Asp.net 5 新功能與變革Asp.net 5 新功能與變革
Asp.net 5 新功能與變革
 

Dependency injection in asp.net core