数据库
首页 > 数据库> > autofac+redis+日志中间件

autofac+redis+日志中间件

作者:互联网

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