asp.net core 自定義中介軟體【以dapper為例】

天府三街第一帥發表於2019-05-16

在asp.net core開發中。按照國際案例開始。都是先在Nuget安裝XXX包。比如我們今天要用到的Dapper

nuget裡面安裝Dapper

1.然後新建一個類檔案DapperExtensions.cs

因為Dapper是IDbConnection擴充套件出來的,所以我們必須給IDbConnection一個預設的實現

 /// <summary>
        /// 注入服務
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="service"></param>
        /// <returns></returns>
        public static IServiceCollection AddDapper<T>(this IServiceCollection service) where T:class,IDbConnection
        {
            service.AddScoped<IDbConnection, T>();
            return service;
        }

如何使用呢?在Startup裡面加入

services.AddDapper();

理論上到這裡,就已經可以勉強使用了。但是本文是記錄中介軟體的學習,所以我們還是得在後面學習一下中介軟體的寫法

2.新建一個DapperMiddleWareExtensions.cs和DapperMiddleWare.cs檔案

 public class DapperMiddleWare
    {

        private readonly RequestDelegate _next;
        private DapperOption _option;

        public DapperMiddleWare(RequestDelegate next, DapperOption option)
        {
            _next = next;
            this._option = option;
        }

        public async Task InvokeAsync(HttpContext context)
        {

            var conn = context.RequestServices.GetService<IDbConnection>();

            if (_option != default(DapperOption))
            {
                if (!_option.connStr.IsNull())
                {
                    conn.ConnectionString = _option.connStr;
                }
            }
            // Call the next delegate/middleware in the pipeline
            await _next(context);
        }
    }
public static class DapperMiddleWareExtensions
    {
        public static IApplicationBuilder UseDapper(this IApplicationBuilder builder, Action<DapperOption> option = null)
        {
            DapperOption opt = new DapperOption();
            if (option != null)
            {
                option(opt);
            }
            return builder.UseMiddleware<DapperMiddleWare>(opt);
        }
    }

使用:

app.UseDapper(opt =>
{
opt.connStr = Configuration[“db:mysqlmaster”];
});

 

這兩段程式碼非常簡單。就是編寫一個IApplicationBuilder的擴充套件方法,然後再擴充套件方法裡面獲取到注入的IDbconnection的介面,然後把委託方法傳遞進來的預設配置引數賦值進去,就可以了。

實際上,也可以在AddService的時候就可以把委託配置給賦值進去,很多第三方的庫就是這麼做的。

 
 

相關文章