【無私分享:ASP.NET CORE 項目實戰(第二章)】添加EF上下文對象,添加接口、實現類以及無處不在的依賴注入(DI)

 

目錄索引 

 

【無私分享:ASP.NET CORE 項目實戰】目錄索引html

 

簡介

 

  上一章,咱們介紹了安裝和新建控制器、視圖,這一章咱們來建立個數據模型,而且添加接口和實現類。數據庫

 

 

添加EF上下文對象

 

  按照咱們之前的習慣,咱們仍是新建幾個文件夾json

  Commons:存放幫助類app

  Domians:數據模型框架

  Services:接口和實現類ide

  

咱們在Domains文件夾下添加一個類庫 Domain函數

 

 

咱們新建一個類 ApplicationDbContext 繼承 DbContextpost

 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         }

 

    說明:

 

 

調用接口

 

  注入有三種方式:構造器注入屬性注入 和 方法注入。咱們在  【無私分享:從入門到精通ASP.NET MVC】 系列中大部分使用的是 屬性注入,今天咱們使用的是 構造器注入

  咱們在 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 如今很火熱,可是網上的不少資料都是前篇一概的複製,因此有不少問題我也暫時沒有解決,但願你們能共同幫助一下!

 

原創文章 轉載請尊重勞動成果 http://yuangang.cnblogs.com

相關文章
相關標籤/搜索