ASP.NET Core Web 應用程序系列(二)- 在ASP.NET Core中使用Autofac替換自帶DI進行批量依賴注入(MVC當中應用)...

在上一章中主要和大家分享在MVC當中如何使用ASP.NET Core內置的DI進行批量依賴注入,本章將繼續和大家分享在ASP.NET Core中如何使用Autofac替換自帶DI進行批量依賴注入。

PS:本章將主要采用構造函數注入的方式,下一章將繼續分享如何使之能夠同時支持屬性注入的方式。

約定:

1、倉儲層接口都以“I”開頭,以“Repository”結尾。倉儲層實現都以“Repository”結尾。

2、服務層接口都以“I”開頭,以“Service”結尾。服務層實現都以“Service”結尾。

接下來我們正式進入主題,在上一章的基礎上我們再添加一個web項目TianYa.DotNetShare.CoreAutofacMvcDemo,首先來看一下我們的解決方案

本demo的web項目為ASP.NET Core Web 應用程序(.NET Core 2.2) MVC框架,需要引用以下幾個程序集:

1、TianYa.DotNetShare.Model 我們的實體層

2、TianYa.DotNetShare.Service 我們的服務層

3、TianYa.DotNetShare.Repository 我們的倉儲層,正常我們的web項目是不應該使用倉儲層的,此處我們引用是為了演示IOC依賴注入

4、Autofac 依賴注入基礎組件

5、Autofac.Extensions.DependencyInjection 依賴注入.NET Core的輔助組件

其中Autofac和Autofac.Extensions.DependencyInjection需要從我們的NuGet上引用,依次點擊下載以下2個包:

接著我們在web項目中添加一個類AutofacModuleRegister.cs用來注冊Autofac模塊,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;using Autofac;namespace TianYa.DotNetShare.CoreAutofacMvcDemo
{/// <summary>/// 注冊Autofac模塊/// </summary>public class AutofacModuleRegister : Autofac.Module{/// <summary>/// 重寫Autofac管道Load方法,在這里注冊注入/// </summary>protected override void Load(ContainerBuilder builder){builder.RegisterAssemblyTypes(GetAssemblyByName("TianYa.DotNetShare.Repository")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces();builder.RegisterAssemblyTypes(GetAssemblyByName("TianYa.DotNetShare.Service")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces();//注冊MVC控制器(注冊所有到控制器,控制器注入,就是需要在控制器的構造函數中接收對象)builder.RegisterAssemblyTypes(GetAssemblyByName("TianYa.DotNetShare.CoreAutofacMvcDemo")).Where(a => a.Name.EndsWith("Controller")).AsImplementedInterfaces();}/// <summary>/// 根據程序集名稱獲取程序集/// </summary>/// <param name="assemblyName">程序集名稱</param>public static Assembly GetAssemblyByName(string assemblyName){return Assembly.Load(assemblyName);}}
}

然后打開我們的Startup.cs文件進行注入工作,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;using Autofac;
using Autofac.Extensions.DependencyInjection;namespace TianYa.DotNetShare.CoreAutofacMvcDemo
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public IServiceProvider ConfigureServices(IServiceCollection services){services.Configure<CookiePolicyOptions>(options =>{// This lambda determines whether user consent for non-essential cookies is needed for a given request.options.CheckConsentNeeded = context => true;options.MinimumSameSitePolicy = SameSiteMode.None;});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);return RegisterAutofac(services); //注冊Autofac
        }// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Home/Error");}app.UseStaticFiles();app.UseCookiePolicy();app.UseMvc(routes =>{routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");});}/// <summary>/// 注冊Autofac/// </summary>private IServiceProvider RegisterAutofac(IServiceCollection services){//實例化Autofac容器var builder = new ContainerBuilder();//將services中的服務填充到Autofac中
            builder.Populate(services);//新模塊組件注冊    builder.RegisterModule<AutofacModuleRegister>();//創建容器var container = builder.Build();//第三方IoC容器接管Core內置DI容器 return new AutofacServiceProvider(container);}}
}

PS:需要將自帶的ConfigureServices方法的返回值改成IServiceProvider

接下來我們來看看控制器里面怎么弄:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using TianYa.DotNetShare.CoreAutofacMvcDemo.Models;using TianYa.DotNetShare.Service;
using TianYa.DotNetShare.Repository;namespace TianYa.DotNetShare.CoreAutofacMvcDemo.Controllers
{public class HomeController : Controller{/// <summary>/// 定義倉儲層學生抽象類對象/// </summary>protected IStudentRepository StuRepository;/// <summary>/// 定義服務層學生抽象類對象/// </summary>protected IStudentService StuService;/// <summary>/// 通過構造函數進行注入/// 注意:參數是抽象類,而非實現類,因為已經在Startup.cs中將實現類映射給了抽象類/// </summary>/// <param name="stuRepository">倉儲層學生抽象類對象</param>/// <param name="stuService">服務層學生抽象類對象</param>public HomeController(IStudentRepository stuRepository, IStudentService stuService){this.StuRepository = stuRepository;this.StuService = stuService;}public IActionResult Index(){var stu1 = StuRepository.GetStuInfo("10000");var stu2 = StuService.GetStuInfo("10001");string msg = $"學號:10000,姓名:{stu1.Name},性別:{stu1.Sex},年齡:{stu1.Age}<br />";msg += $"學號:10001,姓名:{stu2.Name},性別:{stu2.Sex},年齡:{stu2.Age}";return Content(msg, "text/html", System.Text.Encoding.UTF8);}public IActionResult Privacy(){return View();}[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]public IActionResult Error(){return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });}}
}

至此完成處理,接下來就是見證奇跡的時刻了,我們來訪問一下/home/index,看看是否能返回學生信息。

可以發現,返回了學生的信息,說明我們注入成功了。

至此,本章就介紹完了,如果你覺得這篇文章對你有所幫助請記得點贊哦,謝謝!!!

demo源碼:

鏈接:https://pan.baidu.com/s/1un6_wgm6w_bMivPPRGzSqw 
提取碼:lt80

?

版權聲明:如有雷同純屬巧合,如有侵權請及時聯系本人修改,謝謝!!!

轉載于:https://www.cnblogs.com/xyh9039/p/11379831.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS手勢操作簡介(五)

利用手勢操作實現抽屜效果&#xff1a; 第一步&#xff1a;搭建UI (void)addChildView { // left UIView *leftView [[UIView alloc] initWithFrame:self.view.bounds]; leftView.backgroundColor [UIColor greenColor]; [self.view addSubview:leftView]; _leftView…

Java過濾器與SpringMVC攔截器之間的關系與區別

今天學習和認識了一下&#xff0c;過濾器和SpringMVC的攔截器的區別&#xff0c;學到了不少的東西&#xff0c;以前一直以為攔截器就是過濾器實現的&#xff0c;現在想想還真是一種錯誤啊&#xff0c;而且看的比較粗淺&#xff0c;沒有一個全局而又細致的認識&#xff0c;由于已…

iOS手勢操作簡介(六)

利用UIGestureRecognizer來對手勢進行處理&#xff1a; interface HMViewController () property (weak, nonatomic) IBOutlet UIImageView *imagView; end implementation HMViewController (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup aft…

iOS并行程序開發- GCD NSOperationQueue(1)

import UIKit let imageURLs [“http://www.planetware.com/photos-large/F/france-paris-eiffel-tower.jpg“, “http://adriatic-lines.com/wp-content/uploads/2015/04/canal-of-Venice.jpg“, “http://algoos.com/wp-content/uploads/2015/08/ireland-02.jpg“, “http:…

二次冪權限設計

設置含有的權限如增刪改查減為1,2,4,8,16 如果A包含增刪改這5個權限&#xff0c;那A的值為1247 如果B包含增改查這5個權限&#xff0c;那A的值為14813 如果C包含增刪改查減這5個權限&#xff0c;那A的值為12481631 7二進制為111,13的二進制為1101,31二進制為11111 1二進制為1&a…

最好用的koa2+mysql的RESTful API腳手架,mvc架構,支持node調試,pm2部署。

#基于webpack構建的 Koa2 restful API 服務器腳手架這是一個基于 Koa2 的輕量級 RESTful API Server 腳手架&#xff0c;支持 ES6, 支持使用TypeScript編寫。GIT地址&#xff1a;https://github.com/Allenzihan/koa2-mysql-framework.git此腳手架只安裝了一些配合koa2使用的必要…

使用putty在linux主機和windows主機之間拷貝文件(已測試可執行)

轉載于&#xff0c;請點擊 首先下載putty&#xff0c;putty下載地址zip&#xff0c; 解壓zip發現里面有plink.exe pscp.exe psftp.exe putty.exe puttygen.exe puttytel.exe等可執行文件&#xff0c;如果只是想要鏈接主機做一些操作那么使用putty.exe&#xff0c;要想要上傳 …

博客園在升級的路上,不妨更自信些,同時說說我們可以為博客園做些什么

最近&#xff0c;博客園在技術升級上做了積極向上的努力&#xff0c;雖然中間過程出現反復&#xff0c;但姑且先不論最終升級后客戶體驗方面的提升&#xff0c;在升級過程中探索排查問題和解決問題的過程&#xff0c;本身就能幫助博客園團隊和廣大用戶積累經驗和提升能力&#…

iOS中持久化存儲SQLite(一)

在iOS中做持久化存儲有多種方案&#xff0c;其中包括plist, preference, sqlite, core data,其中&#xff1a; &#xff08;1&#xff09;plist, preference適合小型數據存儲&#xff0c;因為每次存儲前都必須將文件內容讀到內存中&#xff0c;因此如果數據量過大就會占用大量…

多進程相關內容

多進程相關內容 multiprocessing模塊與process類 multiprocessing python中的多線程無法利用多核優勢&#xff0c;如果想要充分地使用多核CPU的資源&#xff08;os.cpu_count()查看&#xff09;&#xff0c;在python中大部分情況需要使用多進程。Python提供了multiprocessing。…

iOS中SQLite持久化存儲第三方庫FMDB

interface HMShopTool : NSObject (NSArray *)shops; (void)addShop:(HMShop *)shop; end implementation HMShopTool static FMDatabase *_db; (void)initialize { // 1.打開數據庫 NSString *path [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, N…

python超神之路:python異常對照表

python異常對照表 異常名稱描述BaseException所有異常的基類SystemExit解釋器請求退出KeyboardInterrupt用戶中斷執行(通常是輸入^C)Exception常規錯誤的基類StopIteration迭代器沒有更多的值GeneratorExit生成器(generator)發生異常來通知退出StandardError所有的內建標準異常…

python超神之路:創建對象的9種方法

python生成對象的9種方法 class Point:def __init__(self,x,y):self.x xself.y y import sys import copy import typespoint1 Point(1,2) point2 eval("{}({},{})".format("Point",1,2)) point3 globals()[Point](1,2) point4 locals()["Point…

面向接口的編程

面向接口的編程&#xff0c;將接口與實現分離&#xff0c;可以極大的降低代碼的耦合&#xff0c;比如在編程中使用的加密接口&#xff0c;如果將具體的加密算法寫入到使用加密的地方&#xff0c;這樣就會導致&#xff0c;下一次加密方法發生改變的時候會導致大量的地方需要修改…

ASP.NET Core Web 應用程序系列(三)- 在ASP.NET Core中使用Autofac替換自帶DI進行構造函數和屬性的批量依賴注入(MVC當中應用)...

在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替換自帶DI進行構造函數的批量依賴注入&#xff0c;本章將和大家繼續分享如何使之能夠同時支持屬性的批量依賴注入。 約定&#xff1a; 1、倉儲層接口都以“I”開頭&#xff0c;以“Repository”結尾。倉儲層實現都以…

可視化caffe模型結構及在線可視化

在線可視化caffe模型結構 http://ethereon.github.io/netscope/#/editor 假設Caffe的目錄是$(CAFFE_ROOT) 1.編譯caffe的python接口 $ make pycaffe 2.裝各種依賴 $ pip install pydot $ sudo apt-get install graphviz 3.可視化模型 draw_net.py執行的時候帶三個參數 …

布式緩存系統Memcached簡介與實踐

緣起: 在數據驅動的web開發中&#xff0c;經常要重復從數據庫中取出相同的數據&#xff0c;這種重復極大的增加了數據庫負載。緩存是解決這個問題的好辦法。但是ASP.NET中的雖然已經可以實現對頁面局部進行緩存&#xff0c;但還是不夠靈活。此時Memcached或許是你想要的。Memca…

仿百度翻頁(轉)

https://www.cnblogs.com/fozero/p/9874334.html 轉載于:https://www.cnblogs.com/hj0711/p/11390203.html

matlab 多核并行編程

在使用matlab處理大數據&#xff0c;編程需要注意兩個問題&#xff1a;并行運算和釋放內存。matlab也提供了并行計算的功能&#xff0c;甚至能用GPU加速。并行計算工具箱&#xff0c;叫做parallel computing toolbox.它的使用方法&#xff0c;可以從matlab的幫助獲得。 Parall…

iOS核心動畫之CALayer(1)

本文目錄 一、什么是CALayer二、CALayer的簡單使用 回到頂部一、什么是CALayer * 在iOS系統中&#xff0c;你能看得見摸得著的東西基本上都是UIView&#xff0c;比如一個按鈕、一個文本標簽、一個文本輸入框、一個圖標等等&#xff0c;這些都是UIView。 * 其實UIView之所以能顯…