文件内容 ReadWriteSplitInterceptor.cs 3 KB 3196 字符
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Configuration;
using System.Data.Common;

namespace PasteApeart.EntityFrameworkCore
{
    /// <summary>
    /// 
    /// </summary>
    public class ReadWriteSplitInterceptor : DbConnectionInterceptor
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly IConfiguration _configuration;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <param name="config"></param>
        public ReadWriteSplitInterceptor(IHttpContextAccessor serviceProvider, IConfiguration config)
        {

            _httpContextAccessor = serviceProvider;
            _configuration = config;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="eventData"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override InterceptionResult ConnectionOpening(DbConnection connection, ConnectionEventData eventData, InterceptionResult result)
        {
            var isReadOnly = _httpContextAccessor.HttpContext?.Items["IsReadOnly"] as bool? ?? false;
            if (isReadOnly)
            {
                Console.WriteLine("配置只读链接串");
                //connection.ConnectionString = _config.GetConnectionString("ReadOnly");
                connection.ConnectionString = _configuration.GetConnectionString(PasteApeartDbProperties.SqliteReadOnlyConnectionStringName);
            }
            else
            {
                connection.ConnectionString = _configuration.GetConnectionString(PasteApeartDbProperties.SqliteConnectionStringName);
            }
            return base.ConnectionOpening(connection, eventData, result);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="eventData"></param>
        /// <param name="result"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public override ValueTask<InterceptionResult> ConnectionOpeningAsync(DbConnection connection, ConnectionEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default)
        {
            var isReadOnly = _httpContextAccessor.HttpContext?.Items["IsReadOnly"] as bool? ?? false;
            if (isReadOnly)
            {
                Console.WriteLine("配置只读链接串");
                connection.ConnectionString = _configuration.GetConnectionString(PasteApeartDbProperties.SqliteReadOnlyConnectionStringName);
                //connection.ConnectionString = _config.GetConnectionString("ReadOnly");
            }
            else
            {
                connection.ConnectionString = _configuration.GetConnectionString(PasteApeartDbProperties.SqliteConnectionStringName);
            }
            return base.ConnectionOpeningAsync(connection, eventData, result, cancellationToken);
        }

        //使用案例 先注入ReadWriteSplitInterceptor 应该是Icope
    }

}
​ ​