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