1. 程式人生 > >【無私分享:ASP.NET CORE 專案實戰(第二章)】新增EF上下文物件,新增介面、實現類以及無處不在的依賴注入(DI)

【無私分享:ASP.NET CORE 專案實戰(第二章)】新增EF上下文物件,新增介面、實現類以及無處不在的依賴注入(DI)

目錄索引

簡介

  上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。

新增EF上下文物件

  按照我們以前的習慣,我們還是新建幾個資料夾

  Commons:存放幫助類

  Domians:資料模型

  Services:介面和實現類

我們在Domains資料夾下新增一個類庫 Domain

我們新建一個類 ApplicationDbContext 繼承 DbContext

 1 using Microsoft.EntityFrameworkCore;
 2 
 3 namespace
Domain 4 { 5 public class ApplicationDbContext : DbContext 6 { 7 public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) 8 : base(options) 9 { 10 } 11 12 protected override void OnModelCreating(ModelBuilder builder)
13 { 14 base.OnModelCreating(builder); 15 } 16 } 17 }

  說明:

  DbContext 需要引用 Microsoft.EntityFrameworkCore

  第一種方式:選中 DbContext 通過組合鍵  Ctrl+. 新增 Microsoft.EntityFrameworkCore 引用

  第二種方式:在Domain 類庫的 project.json 中新增 Microsoft.EntityFrameworkCore 引用

  然後,我們開啟 \src\Startup.cs

修改 ConfigureServices(IServiceCollection services) 方法,增加對EF的支援(黃色高亮):

 1     // This method gets called by the runtime. Use this method to add services to the container.
 2         public void ConfigureServices(IServiceCollection services)
 3         {
 4             // Add framework services.
 5             services.AddApplicationInsightsTelemetry(Configuration);
 6 
 7             services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection")));
 8 
 9             services.AddMvc();
10 
11         }

  上面的 SqlServerConnection 是我們的資料庫連線字串,它的配置在 \src\appsettings.json 檔案中(這個名字讓我們想起了appsetting.config):

這樣,實際上我們就完成了,但是我們後面會用到,我們目前不操作資料。

新增介面和實現類

  我們來新增一個介面和實現類,來看一下Asp.net Core的依賴注入。

  我們在Services資料夾下新增一個類庫 Service

我們在 Service 類庫下,新建 三個資料夾:

IDao:存放基礎操作類

IService:存放介面檔案

ServiceImp:存放實現類

IDao 我們先不管,我們後面 IRepositorycs和Repositorycs(DDD 領域驅動設計) 會使用到,我們主要是新增一個介面和實現類。為了更好的歸類介面和實現類,我們在 IService 和 ServiceImp 資料夾下面分別建立一個資料夾 SysManage 用於存放系統管理介面。

我們在 \IService\SysManage\ 下新建一個介面 IUserManage 

 1 namespace Service.IService
 2 {
 3     public interface IUserManage
 4     {
 5         /// <summary>
 6         /// 測試介面
 7         /// </summary>
 8         /// <returns></returns>
 9         string Test();
10     }
11 }

  我們在 \ServiceImp\SysManage\ 下新建一個實現類 UserManage 

 1 namespace Service.ServiceImp
 2 {
 3     public class UserManage : IService.IUserManage
 4     {
 5         public string Test()
 6         {
 7             return "我實現了介面方法Test";
 8         }
 9     }
10 }

   修改 \src\Startu.cs ConfigureServices(IServiceCollection services) 方法,實現注入(黃色高亮):

 1 // This method gets called by the runtime. Use this method to add services to the container.
 2         public void ConfigureServices(IServiceCollection services)
 3         {
 4             // Add framework services.
 5             services.AddApplicationInsightsTelemetry(Configuration);
 6 
 7             services.AddDbContext<ApplicationDbContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("SqlServerConnection")));
 8 
 9             services.AddMvc();
10 
11             // Add application services.       
12             services.AddTransient<Service.IService.IUserManage, Service.ServiceImp.UserManage>();
13         }

    說明:

呼叫介面

  注入有三種方式:構造器注入屬性注入 和 方法注入。我們在   系列中大部分使用的是 屬性注入,今天我們使用的是 構造器注入

  我們在 HomeController 中 宣告介面

  private readonly IUserManage _UserManage;

  在控制器建構函式中 新增: 

  public HomeController(IUserManage UserManage)
  {
    _UserManage = UserManage;
  }

  依賴注入框架會自動找到 IUserManage 實現類的例項,賦值給該建構函式

  我們在 About 檢視中 測試一下:

  public IActionResult About()
  {
    ViewData["Message"] = _UserManage.Test();

    return View();
  }

  Ctrl+F5 執行一下:

說明注入成功!(在Asp.net Core中,我們修改程式碼後直接儲存重新整理頁面就可以,不再像以前那樣 要重新編譯生成,這點還是很讚的。)

三種注入方式:

  構造器注入

  構造器注入就在在建構函式中藉助引數將依賴的物件注入到建立的物件之中。如下面的程式碼片段所示,Foo針對Bar的依賴體現在只讀屬性Bar上,針對該屬性的初始化實現在建構函式中,具體的屬性值由建構函式的傳入的引數提供。當DI容器通過呼叫建構函式建立一個Foo物件之前,需要根據當前註冊的型別匹配關係以及其他相關的注入資訊建立並初始化引數物件。

  1: public class Foo
   2: {
   3:     public IBar Bar{get; private set;}
   4:     public Foo(IBar bar)
   5:     {
   6:         this.Bar = bar;
   7:     }
   8: }

除此之外,構造器注入還體現在對建構函式的選擇上面。如下面的程式碼片段所示,Foo類上面定義了兩個建構函式,DI容器在建立Foo物件之前首選需要選擇一個適合的建構函式。至於目標建構函式如何選擇,不同的DI容器可能有不同的策略,比如可以選擇引數做多或者最少的,或者可以按照如下所示的方式在目標建構函式上標註一個相關的特性(我們在第一個建構函式上標註了一個InjectionAttribute特性)。

   1: public class Foo
   2: {
   3:     public IBar Bar{get; private set;}
   4:     public IBaz Baz {get; private set;}
   5:  
   6:     [Injection]
   7:     public Foo(IBar bar)
   8:     {
   9:         this.Bar = bar;
  10:     }
  11:  
  12:     public Foo(IBar bar, IBaz):this(bar)
  13:     {
  14:         this.Baz = baz;
  15:     }
  16: }

  屬性注入

  如果依賴直接體現為類的某個屬性,並且該屬性不是隻讀的,我們可以讓DI容器在物件建立之後自動對其進行賦值進而達到依賴自動注入的目的。一般來說,我們在定義這種型別的時候,需要顯式將這樣的屬性標識為需要自動注入的依賴屬性,以區別於該型別的其他普通的屬性。如下面的程式碼片段所示,Foo類中定義了兩個可讀寫的公共屬性Bar和Baz,我們通過標註InjectionAttribute特性的方式將屬性Baz設定為自動注入的依賴屬性。對於由DI容器提供的Foo物件,它的Baz屬性將會自動被初始化。

  1: public class Foo
   2: {
   3:     public IBar Bar{get; set;}
   4:  
   5:     [Injection]
   6:     public IBaz Baz {get; set;}
   7: }

  方法注入

  體現依賴關係的欄位或者屬性可以通過方法的形式初始化。如下面的程式碼片段所示,Foo針對Bar的依賴體現在只讀屬性上,針對該屬性的初始化實現在Initialize方法中,具體的屬性值由建構函式的傳入的引數提供。我們同樣通過標註特性(InjectionAttribute)的方式將該方法標識為注入方法。DI容器在呼叫建構函式建立一個Foo物件之後,它會自動呼叫這個Initialize方法對只讀屬性Bar進行賦值。在呼叫該方法之前,DI容器會根據預先註冊的型別對映和其他相關的注入資訊初始化該方法的引數。

   1: public class Foo
   2: {
   3:     public IBar Bar{get; private set;}
   4:  
   5:     [Injection]
   6:     public Initialize(IBar bar)
   7:     {
   8:         this.Bar = bar;
   9:     }
  10: }

希望跟大家一起學習Asp.net Core 

剛開始接觸,水平有限,很多東西都是自己的理解和翻閱網上大神的資料,如果有不對的地方和不理解的地方,希望大家指正!

雖然Asp.net Core 現在很火熱,但是網上的很多資料都是前篇一律的複製,所以有很多問題我也暫時沒有解決,希望大家能共同幫助一下!

相關推薦

無私分享ASP.NET CORE 專案實戰第九建立區域Areas新增TagHelper

目錄索引 簡介   在Asp.net Core VS2015中,我們發現還有很多不太簡便的地方,比如右擊新增檢視,轉到試圖頁等功能圖不見了,雖然我們可以通過工具欄的自定義命令,把這兩個右擊選單新增上,但是貌似是灰色的不能用。   其實,這樣也好,通過手動建立,更讓我們深刻的理解M

無私分享ASP.NET CORE 專案實戰第二新增EF上下文物件新增介面實現以及無處不在的依賴注入DI

目錄索引 簡介   上一章,我們介紹了安裝和新建控制器、檢視,這一章我們來建立個數據模型,並且新增介面和實現類。 新增EF上下文物件   按照我們以前的習慣,我們還是新建幾個資料夾   Commons:存放幫助類   Domians:資料模型   Services

無私分享ASP.NET CORE 專案實戰第十釋出專案到 Linux 上執行 Core 專案

目錄索引 簡介   ASP.Net Core 給我們帶來的最大的亮點就是跨平臺,我在我電腦(win7)上用虛擬機器建了個 CentOS7 ,來演示下,我們windows上的專案如何釋出專案到Linux上執行。我這裡有個在windows上搭建過的程式,我們主要演示如何在linux上執

無私分享ASP.NET CORE 專案實戰第六讀取配置檔案 appsettings.json

目錄索引 簡介   在我們之前的Asp.net mvc 開發中,一提到配置檔案,我們不由的想到 web.config 和 app.config,在 core 中,我們看到了很多的變化,新的配置系統顯得更加輕量級,具有更好的擴充套件性,並且支援多樣化的資料來源。   部落格園對於這個的

無私分享ASP.NET CORE 專案實戰第八讀取配置檔案 讀取自定義配置檔案

目錄索引 簡介   但隨之產生了問題:我們使用的是在 Startup.cs 中(如下圖)來實現配置讀取,有兩個問題 ① 我們如果定義N種配置,是否要再這裡新增N條這樣的配置 ; ② 如果我們的配置不想寫在appsettings.json中呢     解決問題

無私分享ASP.NET CORE 專案實戰第十三Asp.net Core 使用MyCat分散式資料庫實現讀寫分離

目錄索引 簡介   MyCat2.0版本很快就釋出了,關於MyCat的動態和一些問題,大家可以加一下MyCat的官方QQ群:106088787。我們今天主要介紹一下,在我們的Asp.net Core中如何使用Mycat,這源於一個大神(Amamiya Yuuko)的分享,但是,這中

無私分享ASP.NET CORE 專案實戰第十一Asp.net Core 快取 MemoryCache 和 Redis

1 /// <summary> 2 /// 修改快取 3 /// </summary> 4 /// <param name="key">快取Key</param> 5 ///

無私分享ASP.NET CORE 專案實戰第四Code First 建立資料庫和資料表

目錄索引 簡介   本章我們來介紹下Asp.net Core 使用 CodeFirst 建立資料庫和表,通過 控制檯 和 dotnet ef 兩種方式 修改EF上下文物件,新增測試類   我修改了一下名字,Domains 改為了 wkmvc.Data   我們新建一個

無私分享ASP.NET CORE 專案實戰第十二新增對SqlServerMySqlOracle的支援

目錄索引 簡介   增加對多資料庫的支援,並不是意味著同時對多種資料庫操作,當然,後面,我們會嘗試同時對多種資料庫操作,這可能需要多個上下文,暫且不論。分散式資料庫,我們採用的是阿里雲的Mycat,這個後面會更新出來。我們今天的場景是:我們的專案可能是在windows上開發的使用的

無私分享ASP.NET CORE 專案實戰第七檔案操作 FileHelper

目錄索引 簡介   在程式設計中,我們很多情況下,會用到對檔案的操作,在 上一個系列 中,我們有很多檔案基本操作的示例,在Core中有一些改變,主要是我們常用的Server.MapPath()不存在了,不知道後續的版本會不會有,在這裡,我們只能自己封裝方法去實現。今天,我們就對一些基本

無私分享ASP.NET CORE 專案實戰第五Repository倉儲 UnitofWork

1 public abstract class Repository<T> : IRepository<T> where T : class 2 { 3 #region 資料上下文 4 5 /// <s

無私分享ASP.NET CORE 專案實戰第十四圖形驗證碼的實現

1 public class VierificationCodeServices 2 { 3 /// <summary> 4 /// 該方法用於生成指定位數的隨機數 5 /// </summary> 6

無私分享ASP.NET CORE 專案實戰第三EntityFramework下領域驅動設計的應用

這好像就是比我的多了一個“中轉層”,把我們的介面作為了一箇中轉,領域層繼承了倉儲實現業務和資料操作,這有什麼實際意義嗎?希望大家指正一下: 我不理解的是,如果是按照這樣,那麼我如果要修改註冊方法,比如我要在上面方法中傳遞 eamil,name,password 的基礎上還需要傳遞手機號碼,那麼我需要修改

乾貨分享ASP.NET COREC#與Spring Boot MVC(JAVA)異曲同工的程式設計方式總結

目錄 C# VS JAVA 基礎語法類比篇: 一、匿名類 二、型別初始化 三、委託(方法引用) 四、Lambda表示式 五、泛型 六、自動釋放

Asp.net core 專案實戰 新聞網站+後臺 原始碼設計原理 視訊教程

首先說明,視訊教程、原始碼並非本人原創 本人將專案分割開,並寫了一些說明。 該視訊教程 地址  https://study.163.com/course/courseMain.htm?courseId=1005955006 原作者 筆者正在學 ASP.NET Core ,發現這

ASP.NET Core 專案實戰持續更新~~~

 一、前言   準備寫這個系列文章的設想開始於今年9月,毫無意外,期間又又又又拖了很長時間,文章主要是為了記錄自己學習使用 ASP.NET Core Web API 與 Vue 建立一個前後端分離的專案的整個過程。嗯,2018年快要結束了,應該能在 .NET Core 3.0 正式版和 Vue 3

ASP.NET Core中使用GraphQL - 第二 中介軟體

前文:ASP.NET Core中使用GraphQL - 第一章 Hello World 中介軟體 如果你熟悉ASP.NET Core的中介軟體,你可能會注意到之前的部落格中我們已經使用了一箇中間件, app.Run(async (context) => { var result =

ASP.NET Core 中文文件 第二 指南1用 Visual Studio Code 在 macOS 上建立首個 ASP.NET Core 應用程式

本文已更新,最後更新於2017年4月28日 聯絡我們: QQ Group: 436035237 (dotNet Core Studying Group) GitHub Repo: https://github.com/dotnetcore/aspnetcore-doc-cn/ 以下為老翻譯存檔 本節將

ASP.NET Core 中文文件 第二 指南2用 Visual Studio 和 ASP.NET Core MVC 建立首個 Web API

HTTP 協議不僅僅提供網頁服務。它也是一個構建公開服務和資料 API 的強大平臺。HTTP 協議是簡單、靈活、無處不在的。幾乎你能想到的任何平臺上都有 HTTP 支援,所以 HTTP 服務能夠傳送到多種客戶端, 包括瀏覽器,移動裝置和傳統的桌面應用程式。 在本教程中,你將建立一個簡單的 Web API 來

ASP.NET Core 中文文件 第二 指南 09 使用 Swagger 生成 ASP.NET Web API 線上幫助測試文件

對於開發人員來說,構建一個消費應用程式時去了解各種各樣的 API 是一個巨大的挑戰。 在你的 Web API 專案中使用 Swagger 的 .NET Core 封裝 Swashbuckle 可以幫助你建立良好的文件和幫助頁面。 Swashbuckle 可以通過修改 Startup.cs 作為一組 NuGe