.Net Framework使用Autofac實現依賴註入

来源:https://www.cnblogs.com/ZYPLJ/archive/2023/09/12/17694895.html
-Advertisement-
Play Games

.Net Framework使用Autofac實現依賴註入 前言 最近也是找了快2周的工作了,收到的面試邀請也就幾個,然後有個面試題目是用asp.net mvc + Entityframework 做一個學生信息增刪改查系統。因為題目要求了用Entityframework 也就是EF 那也就不上co ...


.Net Framework使用Autofac實現依賴註入

前言

最近也是找了快2周的工作了,收到的面試邀請也就幾個,然後有個面試題目是用asp.net mvc + Entityframework 做一個學生信息增刪改查系統。因為題目要求了用Entityframework 也就是EF 那也就不上core了,web項目也是用Framework 4.8去做的。

本文的重點是IOC容器,在Framework 中是沒有自帶的IOC容器的,那麼就需要使用第三方庫去實現依賴註入,我這裡用的是Autofac。

如果不使用IOC容器去管理類,那麼操作資料庫和使用類方法則是

using(MydbContext db = new MydbContext){
	db....
}
StudentService s = new StudentService();
s.Add();

使用方法

Nuget包

首先需要下載2個Nuget包,分別是:

dotnet add package Autofac --version 7.1.0
dotnet add package Autofac.Mvc5 --version 6.1.0

配置文件

然後在配置文件中,也就是Global.asax.cs文件

然後需要添加如下代碼:

// 創建 Autofac 容器生成器
var builder = new ContainerBuilder();

// 註冊 EF 上下文
builder.RegisterType<SchoolContext>().InstancePerRequest();

// 註冊其他服務
builder.RegisterType<StudentService>().As<IStudentService>().InstancePerRequest();
// 註冊控制器
builder.RegisterControllers(typeof(HomeController).Assembly);

// 構建容器
var container = builder.Build();
// 設置 ASP.NET MVC 的依賴解析器為 Autofac
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

上面我註入了一個SchoolContext資料庫上下文服務,用於操作資料庫

然後註冊了StudentService服務,裡面是增刪改查代碼

舉個例子:

public interface IStudentService{
	//刪除
	Task<int> DelAsync(int id);
}
public class StudentService:IStudentService
 {
        private readonly SchoolContext _dbContext;

        public StudentService(SchoolContext dbContext)
        {
            _dbContext = dbContext;
        }
        public async Task<int> DelAsync(int id)
        {
            var student = _dbContext.Students.Include("Score").FirstOrDefault(s => s.Id == id);
            if (student != null)
            {
                // 刪除關聯的成績表
                if (student.Score != null)
                {
                    _dbContext.Scores.Remove(student.Score);
                }

                // 刪除學生
                _dbContext.Students.Remove(student);
                return await _dbContext.SaveChangesAsync();
            }
            return 0;
    }
}

上面StudentService類實現了IStudentService介面的方法,並且註入了SchoolContext依賴進行資料庫操作。

 public class HomeController : Controller
 {
        private readonly IStudentService _studentService;
        public HomeController(IStudentService studentService)
        {
            _studentService = studentService;
        }
        public async Task<ActionResult> DelStudent(int id)
        {
            int result = await _studentService.DelAsync(id);
            if (result > 0)
            {
                TempData["SuccessMessage"] = "學生信息刪除成功";
                return RedirectToAction("Index");   
            }
            TempData["SuccessMessage"] = "學生信息刪除失敗";
            return RedirectToAction("Index");   
        }
}

上面的控制器則是註入了IStudentService然後就可以調用它的刪除學生信息的方法了。

我們需要註意的是需要把資料庫上下文和服務類交給容器去管理。

// 註冊 EF 上下文
builder.RegisterType<SchoolContext>().InstancePerRequest();
// 註冊其他服務
builder.RegisterType<StudentService>().As<IStudentService>().InstancePerRequest();
// 註冊控制器
builder.RegisterControllers(typeof(HomeController).Assembly);

同時也要註冊控制器,一開始我去寫的的時候沒有註冊控制器,然後會報構造函數不能為空的錯誤!

生命周期

  1. InstancePerDependency:每次解析時都創建一個新的實例。這是預設的生命周期管理方式。
  2. SingleInstance:整個應用程式中只創建一個實例,併在後續的解析中重用該實例。
  3. InstancePerLifetimeScope:每個生命周期範圍內只創建一個實例。生命周期範圍可以通過Autofac的BeginLifetimeScope()方法創建。
  4. InstancePerMatchingLifetimeScope:與InstancePerLifetimeScope類似,但只有在解析時與指定的生命周期範圍匹配時才會創建實例。
  5. InstancePerRequest:在Web應用程式中,每個HTTP請求都創建一個新的實例。這通常用於在Web API或MVC應用程式中註冊服務。
  6. InstancePerOwned:在每個Owned<T>上創建一個新的實例。Owned<T>是一個特殊的類型,用於在需要時創建和釋放實例。

參考資料


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

-Advertisement-
Play Games
更多相關文章
  • 二叉搜索樹(Binary Search Tree,BST) 二叉搜索樹(Binary Search Tree),也稱二叉查找樹或二叉排序樹,是一種特殊的二叉樹,它滿足以下性質 對於二叉搜索樹的每個節點 左子樹中的所有節點的值都小於該節點的值 右子樹中的所有節點的值都大於(或等於)該節點的值 對於二叉 ...
  • 關註公眾號【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。 語句 語句是Go編程語言中完成特定操作的單 ...
  • 二叉樹(binary tree) 二叉樹(Binary Tree)是一種常見的樹狀數據結構,它由一組節點組成,每個節點最多有兩個子節點,分別稱為左子節點和右子節點。二叉樹具有以下特點: 每個節點最多有兩個子節點,分別稱為左子節點和右子節點。 左子樹和右子樹也是二叉樹,它們的結構與父節點類似。 二叉樹 ...
  • 來源:https://www.cnblogs.com/zisefeizhu/p/13692782.html 前言 我司的集群時刻處於崩潰的邊緣,通過近三個月的掌握,發現我司的集群不穩定的原因有以下幾點: 1、發版流程不穩定 2、缺少監控平臺【最重要的原因】 3、缺少日誌系統 4、極度缺少有關操作文檔 ...
  • 面試題:@Transactional聲明式事務註解什麼時候會失效 前言 今天來分享一道比較有意思的面試題,“@Transactional聲明式事務註解什麼時候會失效?”。 對於這個問題,我們一起看看考察點和比較好的回答吧! 考察點 這個問題就是面試官想考察我們對@Transactional註解有沒有 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 關於LeetCode98 做這道題之前,我反覆審題,最後確認:沒錯,不存在什麼坑,這道題確實非常非常簡單,然而卻被官方定義為中等難度 這一定是送分,白撿一 ...
  • 上一篇《如何正確實現一個自定義 Exception》發佈後獲得不少 star。有同學表示很擔憂,原來自己這麼多年一直寫錯了。其實大家不用過分糾結,如果寫的是 .NET CORE 1.0+ 的程式,那麼大概率是沒有問題的。 有大佬已經在評論區指出這些信息是過時的了。確實在.NET CORE 發佈之後, ...
  • C#常用的五種定時器分別是: System.Timers.Timer System.Threading.Timer System.Windows.Threading.DispatcherTimer : WPF應用程式 System.Windows.Forms.Timer :WinForm應用程式 S ...
一周排行
    -Advertisement-
    Play Games
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...