[ASP.net Core] 利用DI注入方式在ASP.net Core中使用Dapper

using DI and Dapper in Asp.net Core

前言

很久以前自己寫過一個打包整層ADO.net技術的SqlHelper類別,分享自己存取資料庫使用的SqlHelper類別,ADO.net技術

缺點是產生出來的結果是弱型別:DataTable、DataRow

其實從Nuget可以安裝Dapper這玩意兒,用法和SQLHelper類似,也是在程式中寫下SQL語法就可以存取資料庫,而且產生出來的結果支援強型別

本文記錄一下如何在ASP.net Core中利用DI注入方式使用Dapper,讓"指派資料庫連線"的程式碼寫在Startup.cs,增加程式碼的簡潔

Dapper 專案網址(裡頭有Dapper完整用法說明):https://github.com/StackExchange/Dapper

實作

Startup.cs的片段程式碼↓

using System.Data.SqlClient;
using System.Data.Common;
        public IConfiguration Configuration { get; }
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        } 
        public void ConfigureServices(IServiceCollection services)
        {

            //Scoped:注入的物件在同一Request中,參考的都是相同物件(你在Controller、View中注入的IDbConnection指向相同參考)
            services.AddScoped<IDbConnection,SqlConnection>(serviceProvider => {
                SqlConnection conn = new SqlConnection();
                //指派連線字串
                conn.ConnectionString = Configuration.GetConnectionString("DefaultConnection");
                return conn;
            });

            services.AddControllersWithViews();
        } 

Controller的片段程式碼↓

using System.Data.Common;
 public class HomeController : Controller
 {
        private readonly IDbConnection _conn;

        public HomeController(IDbConnection conn)
        {
            this._conn = conn;
        }

        public IActionResult Index()
        {
            //Dapper查詢資料,注意不能用IEnumerable<DataRow>來接結果
            IEnumerable<dynamic> rows =  this._conn.Query("Select * from ApplicableProduct");

            StringBuilder sb = new StringBuilder();
            foreach (dynamic row in rows)
            {
                sb.AppendLine(row.Product1);
            }//end foreach
            string result = sb.ToString(); 
             
            return Content(result);//直接顯示結果
        } 
    }