ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

autofac+redis+日志中间件

2022-05-26 03:31:06  阅读:175  来源: 互联网

标签:autofac return string 中间件 redis db connection key null


autofac需要下载Autofac+Autofac.Extensions.DependencyInjection

推荐创建一个类

 

 

 我这里TestServer是接口和实现类都在这个里面,直接读取进行批量注入

然后去Program进行替换

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
       .ConfigureContainer<ContainerBuilder>(builder =>
       {
           builder.RegisterModule(new AutofacConfig());//这里是刚才我们创建的类
       });

我们下一步是写那个配合我们autofac的日志

首先先安装Castle.Core+Autofac.Extras.DynamicProxy

也在创建一个类

 

 

 这里继承的是他提供给我们的接口

这里我用StackTrace找不到调用者的方法名称。。。。。。

然后在到我们的autofacConfig类里注入

这个aop是可以选择那些方法进行记录日志的,到注入的后面加上下面的代码就行

protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType(typeof( LogMidd));//这里先注入
            builder.RegisterAssemblyTypes(Assembly.Load("TestServer")).Where(x => x.Name.EndsWith("Imp")).AsImplementedInterfaces()//单列
                .EnableInterfaceInterceptors().InterceptedBy(typeof(LogMidd));

            ///这aop是可以选择那些进入实现类要写日志的 
            ///在注入的后面加上这下面的代码
            ///  .EnableInterfaceInterceptors().InterceptedBy(typeof(LogMidd));
        }

 

 public Rediscs()
        {
            _connection = ConnectionMultiplexer.Connect(ConnectionString);

        }
        ///
        /// 连接字符串
        ///
        private static string ConnectionString = "127.0.0.1:6379";
        ///
        /// 锁
        ///
        private readonly object _lock = new object();
        ///
        /// 连接对象
        ///
        private volatile IConnectionMultiplexer _connection;
        ///
        /// 数据库
        ///
        private IDatabase _db(int? db = 8)
        {
            return GetDatabase(db);
        }

        /// 获取连接
        ///
        ///
        protected IConnectionMultiplexer GetConnection()
        {
            if (_connection != null && _connection.IsConnected)
            {
                return _connection;
            }
            lock (_lock)
            {
                if (_connection != null && _connection.IsConnected)
                {
                    return _connection;
                }
                if (_connection != null)
                {
                    _connection.Dispose();
                }
                _connection = ConnectionMultiplexer.Connect(ConnectionString);
            }
            return _connection;
        }
        /// <summary>
        /// 选择库
        /// </summary>
        public IDatabase GetDatabase(int? db)
        {
            return _connection.GetDatabase(db ?? -1);
        }
        /// <summary>
        /// 返回这个库里所有的缓存
        /// </summary>
        public  List<RedisValue> GetAlls(int db)
        {
           var keys= _connection.GetServer(ConnectionString).Keys(2);//读取这个库里的所有key 他这个你把他tolist是读取不到他的value的 他有访问级别限制
             List<RedisKey> listkey = new List<RedisKey>();
            keys.ToList().ForEach(key =>
            {
                listkey.Add(key);
            });
            return _db(db).StringGet(listkey.ToArray()).ToList();
        }
        /// <summary>
        /// 判断这个key是否存在这个库里
        /// </summary>
        /// <returns></returns>
        public async Task<bool> IsBool(string key, int? db = null)
        {
            if (string.IsNullOrWhiteSpace(key))
                return false;
            if (db.HasValue)
                return await _db(db).KeyExistsAsync(key);
            return await _db().KeyExistsAsync(key);

        }
        /// <summary>
        /// 从这个库里删除
        /// </summary>
        public async Task<bool> Delete(string key, int? db = null)
        {

            if (string.IsNullOrWhiteSpace(key))
                return false;
            if (db.HasValue)
                return await _db(db).KeyDeleteAsync(key);
            return await _db().KeyDeleteAsync(key);
        }
        /// <summary>
        /// 获取这个key的value
        /// </summary>
        /// <param name="key"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        public async Task<object> GetRedis(string key, int? db = null)
        {

            if (string.IsNullOrWhiteSpace(key)) return null;
            if (!db.HasValue)
                return await _db().StringGetAsync(key);
            return await _db(db).StringGetAsync(key);

        }
        /// <summary>
        /// 添加进入库里面
        /// </summary>
        public async Task<bool> Create(string key, object value, TimeSpan? time = null, int? db = null)
        {

            if (string.IsNullOrWhiteSpace(key))
                return false;
            if (!time.HasValue) time = TimeSpan.FromDays(1);
            if (db.HasValue)
                return await _db(db).StringSetAsync(key, Serialize(value), time);
            return await _db().StringSetAsync(key, Serialize(value), time);

        }
        private byte[] Serialize(object data)
        {
            var json = JsonConvert.SerializeObject(data);
            return Encoding.UTF8.GetBytes(json);
        }

 

 ok这里输出我们进入了Test类的tests方法入参是一个实体类 还有2

返回了一个实体类

 

标签:autofac,return,string,中间件,redis,db,connection,key,null
来源: https://www.cnblogs.com/bay-max-/p/16311650.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有