asp.Netcoreカスタムミドルウェア【dapperを例に】

5206 ワード

asp.Netcore開発中です.国際的なケースに基づいて開始します.いずれも、まずNugetにXXXパッケージをインストールします.例えば私たちが今日使うDapper
nugetにDapperをインストールする
1.クラスファイルを新規作成します.cs
DapperはIDbConnectionで拡張されているので、IDbConnectionのデフォルトの実装を行う必要があります.
 /// 
        ///     
        /// 
        /// 
        /// 
        /// 
        public static IServiceCollection AddDapper(this IServiceCollection service) where T:class,IDbConnection
        {
            service.AddScoped();
            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();

            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 option = null)
        {
            DapperOption opt = new DapperOption();
            if (option != null)
            {
                option(opt);
            }
            return builder.UseMiddleware(opt);
        }
    }

次の操作を行います.
app.UseDapper(opt =>
{
opt.connStr = Configuration[“db:mysqlmaster”];
});

 
この2つのコードは非常に簡単です.IApplicationBuilderの拡張メソッドを作成し、拡張メソッドで注入されたIDbconnectionのインタフェースを取得し、依頼メソッドから渡されたデフォルトの構成パラメータを付与すればよい.
実際には、AddServiceのときに委任構成を付与することもでき、多くのサードパーティのライブラリがそうしています.