[.NET Core] 簡單使用 Mvc 內置的 IOC

来源:https://www.cnblogs.com/liqingwen/archive/2018/03/15/8571366.html
-Advertisement-
Play Games

本文基於 .NET Core 2.0。 鑒於網上的文章理論較多,鄙人不才,想整理一份 Hello World(Demo)版的文章。 因為使用的是 Mvc 內置的 Ioc,不需要使用 Nuget 安裝其它類庫進行引用。 場景一:簡單類的使用 類 DemoService.cs: 控制器 DemoCont ...


簡單使用 Mvc 內置的 Ioc

  本文基於 .NET Core 2.0。

  鑒於網上的文章理論較多,鄙人不才,想整理一份 Hello World(Demo)版的文章。

 

目錄

  • 場景一:簡單類的使用
  • 場景二:包含介面類的使用
  • 場景三:涉及引用類庫的使用

 

場景一:簡單類的使用

  類 DemoService.cs:

    public class DemoService
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

 

  控制器 DemoController.cs:

    public class DemoController : Controller
    {
        private readonly DemoService _demoService;

        public DemoController(DemoService demoService)
        {
            _demoService = demoService;
        }

        public IActionResult Index()
        {
            return Json(_demoService.Test());
        }
    }

 

  需要先在 Startup.cs 下的 ConfigureServices() 方法中進行註冊才能使用,這裡提供了三種方法,可以選擇自己喜歡的方式進行註冊。

    //方法一
    services.AddSingleton(typeof(DemoService), new DemoService());

    //方法二
    services.AddSingleton(typeof(DemoService));

    //方法三
    services.AddSingleton<DemoService>();

 

 

  執行輸出結果,正常:

 

  IOC 的容器目前有三種生命周期 Transient、Scoped 和 Singleton,使用方式大致相同,具體差異不在這裡進行敘述:

    //範例
    services.AddTransient(typeof(DemoService));
services.AddScoped
<DemoService>();

 

場景二:包含介面類的使用

  介面 IDemo2Service.cs:

    public interface IDemo2Service
    {
        string Test();
    }

 

  介面實現 Demo2Service.cs:

    public class Demo2Service : IDemo2Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

 

  控制器 Demo2Controller.cs:

    public class Demo2Controller : Controller
    {
        private readonly IDemo2Service _demoService;

        public Demo2Controller(IDemo2Service demoService)
        {
            _demoService = demoService;
        }

        public IActionResult Index()
        {
            return Json(_demoService.Test());
        }
    }

 

  目前需要在類 Startup.cs 中的 ConfigureServices() 方法內新增的註冊方法如下(可選其一):

    //方法一
    services.AddSingleton(typeof(IDemo2Service), new Demo2Service());

    //方法二
    services.AddSingleton(typeof(IDemo2Service), typeof(Demo2Service));

    //方法三
    services.AddSingleton<IDemo2Service, Demo2Service>();

 

 

  輸出結果正常:

 

場景三:涉及引用類庫的使用

  我們先新增一個用於標識作用的介面 IServiceSupport.cs,該介面沒有包含方法,只是一個標識作用,有點類似 DDD 的聚合根介面 IAggregateRoot: 

    public interface IServiceSupport
    {
    }

 

  介面 IDemo3Service.cs

    public interface IDemo3Service
    {
        string Test();
    }

 

  介面實現 Demo3Service.cs

    public class Demo3Service : IDemo3Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }

 

  這次我們統一編寫一個方法將該類庫下的所有介面和實現進行註冊:

        private static void AddSingletonServices(IServiceCollection services)
        {
            var asm = Assembly.Load(new AssemblyName("IocCoreDemo.Services"));
            var serviceTypes = asm.GetTypes()
                .Where(x => typeof(IServiceSupport).IsAssignableFrom(x) && !x.GetTypeInfo().IsAbstract);

            foreach (var serviceType in serviceTypes)
            {
                foreach (var serviceInterface in serviceType.GetInterfaces())
                {
                    services.AddSingleton(serviceInterface, serviceType);
                }
            }
        }

 

  因為使用了反射,所以需要 using System.Reflection;

  這次我們在 Startup.cs 類中添加和修改的方法如圖所示:

 

   Startup.cs 類中使用的有效命名空間如下:

using IocCoreDemo.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
using System.Reflection;

  

  如果註入失敗,執行結果便會如圖所示:

 

  為什麼會出現上圖的情況呢?因為小編忘記把介面 IDemo3Service 繼承自介面 IServiceSupport 了,接下來我們只需要做出一個繼承的編寫操作即可:

 

  再次執行啟動,結果便如你所料:

 

 原文地址:http://www.cnblogs.com/liqingwen/p/8571366.html


相關的文章:

  《[.NET Core] 簡單讀取 json 配置文件

  《[.NET Core] 簡單使用 Mvc 內置的 IOC


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.創建變數; 2.使用不同類型的變數; 3.在變數中存儲值; 4.在數學表達式中使用變數; 5.把一個變數的值賦給另一個變數; 6.遞增/遞減變數的值。 程式Variable:使用不同類型的變數並賦初值 1 package com.jsample; 2 3 public class Variabl ...
  • AOP:面向切麵編程,就是把除去業務部分以外的東西單獨模塊化,比如打日誌等,就像學生信息的增刪改查,可以把輸出日誌單獨模塊化出來,通過切麵對的方式進行編程。 在進行實例編寫之前先進行一些專業術語的瞭解 切麵aspect:是對象操作過程中的截面,是一段代碼,實現額外的模塊化功能 連接點join poi ...
  • Spring Boot已成為當今最流行的微服務開發框架,本文是如何使用Spring Boot快速開始Web微服務開發的指南,我們將使創建一個可運行的包含內嵌Web容器(預設使用的是Tomcat)的可運行Jar包。 傳統的Spring應用程式需要配置大量的XML文件才能運行,而使用Spring Boo ...
  • 一、前言 1.1.環境 python版本:3.6 Django版本:1.11.6 1.2.預覽效果 最終搭建的blog的樣子,基本上滿足需求了。框架搭好了,至於CSS,可以根據自己喜好隨意搭配。 二、建立博客應用 2.1.建立項目和應用 創建工程blogproject 創建blog應用 打開 blo ...
  • 中國大學MOOC-陳越、何欽銘-數據結構-2018春 第二講課後習題第四題 ...
  • 字典常用方法 copy() 返回一個字典的淺複製 示例:淺拷貝d.copy() 深拷貝引入import copy copy.deepcopy() clear() 刪除字典內所有元素 clear是清除字典中的元素,不是把這個字典刪除, 刪除字典需要用del 清空字典也可用e={} get() 返回指定 ...
  • 0/5 * * * * ? ... ...
  • 1.通過位置 'a1 = first a2= second a3= third' 'a1 = second a2= first a3= third' 註意如果{}要帶參數,可以將format看成一個函數輸入的值是函數的參數,這些輸入的值可以看成一個元組,{0} == tuple[0] 同樣他們也不能 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...