文件内容 MyDbContextProvider.cs 5 KB 5356 字符
using Microsoft.Extensions.Configuration;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;

namespace ExampleForm.EntityFrameworkCore
{
    /// <summary>
    /// 标注使用只读链接串
    /// </summary>
    public class UseReadOnlyConnectionAttribute : Attribute
    {

    }

    public interface IConnectionStringSelector
    {
        [Obsolete("use readonly")]
        string GetConnectionStringName();

        [Obsolete("use readonly")]
        void SetConnectionStringName(string name);

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        bool IsReadOnly();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="isread"></param>
        void SetReadOnly(bool isread);
    }

    /// <summary>
    /// 返回当前上下文的链接串名称,注意是名称,不是链接字符串
    /// </summary>
    public class ConnectionStringSelector : IConnectionStringSelector
    {
        /// <summary>
        /// 
        /// </summary>
        private string _connectionStringName = ExampleFormDbProperties.SqliteConnectionStringName;

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [Obsolete("use readonly")]
        public string GetConnectionStringName() => _connectionStringName;

        /// <summary>
        /// 只读
        /// </summary>
        private bool _readOnly = false;

        /// <summary>
        /// 是否只读
        /// </summary>
        /// <returns></returns>
        public bool IsReadOnly() => _readOnly;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="name"></param>
        [Obsolete("use readonly")]
        public void SetConnectionStringName(string name) => _connectionStringName = name;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="isread"></param>
        public void SetReadOnly(bool isread) => _readOnly = isread;
    }

    /// <summary>
    /// 基于链接名称,返回对应的链接串
    /// </summary>
    public class DynamicConnectionStringResolver : IConnectionStringResolver, IScopedDependency
    {
        private readonly DefaultConnectionStringResolver _defaultResolver;
        private readonly IConnectionStringSelector _selector;
        private readonly IConfiguration _configurationRoot;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="defaultResolver"></param>
        /// <param name="selector"></param>
        /// <param name="configurationRoot"></param>
        public DynamicConnectionStringResolver(
            DefaultConnectionStringResolver defaultResolver,
            IConnectionStringSelector selector,
            IConfiguration configurationRoot)
        {
            _defaultResolver = defaultResolver;
            _selector = selector;
            _configurationRoot = configurationRoot;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="connectionStringName"></param>
        /// <returns></returns>
        public async Task<string> ResolveAsync(string connectionStringName = null)
        {
            var dynamicConnectionStringName = ExampleFormDbProperties.ConnectionStringName;
            var dataType = _configurationRoot.GetValue<string>("ConnectionStrings:DataType", String.Empty);
            if (dataType == "sqlite")
            {
                if (_selector.IsReadOnly())
                {
                    dynamicConnectionStringName = ExampleFormDbProperties.SqliteReadOnlyConnectionStringName;
                }
                else
                {
                    dynamicConnectionStringName = ExampleFormDbProperties.SqliteConnectionStringName;
                }
            }
            else
            {
                if (_selector.IsReadOnly())
                {
                    dynamicConnectionStringName = ExampleFormDbProperties.ReadonlyConnectionStringName;
                }
            }
            //var dynamicConnectionStringName = _selector.GetConnectionStringName();
            return await _defaultResolver.ResolveAsync(dynamicConnectionStringName);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="connectionStringName"></param>
        /// <returns></returns>
        [Obsolete]
        public string Resolve(string connectionStringName = null)
        {
            var dynamicConnectionStringName = ExampleFormDbProperties.ConnectionStringName;
            var dataType = _configurationRoot.GetValue<string>("ConnectionStrings:DataType", String.Empty);
            if (dataType == "sqlite")
            {
                if (_selector.IsReadOnly())
                {
                    dynamicConnectionStringName = ExampleFormDbProperties.SqliteReadOnlyConnectionStringName;
                }
                else
                {
                    dynamicConnectionStringName = ExampleFormDbProperties.SqliteConnectionStringName;
                }
            }
            else
            {
                if (_selector.IsReadOnly())
                {
                    dynamicConnectionStringName = ExampleFormDbProperties.ReadonlyConnectionStringName;
                }
            }
            //var dynamicConnectionStringName = _selector.GetConnectionStringName();
            return _defaultResolver.Resolve(dynamicConnectionStringName);
        }
    }

}
​ ​