CommandBeforeEventArgs 和 CommandBeforeEventArgs 的 States能否使用同一实例
Feature 特性
CurdBeforeEventArgs CommandBeforeEventArgs CommandAfterEventArgs CurdAfterEventArgs 这几个args的States属性能否使用同一个实例?这样可以在不同事件间传递状态。
使用场景
在CurdBefore事件中获取到EntityType放进states, 然后在CommandBefore事件中取出来,用EntityType去创建logger实例记录sql到日志 然后就可以根据这个EntityType在配置中过滤,有些实体比如审计日志不要记录。
CurdBeforeEventArgs CurdAfterEventArgs 这两个是共享的。
CommandBeforeEventArgs CommandAfterEventArgs 这两个是共享的。
如果这个states能打通 Curd和Command事件,
更进一步,
可以考虑在ISelect、IDelete、IInsert、IUpdate中 加个方法:
.WithData(string key, object value) 往这个states里加数据,那就可以达到依赖注入的效果了有没有。
比如可以 .WithData("log", logger) inject logger,
然后在CommandBeforeEventArgs中resolve这个logger来写日志。
关于 依赖注入的对象,往 AsyncLocal 里面扔也是可以达到目的
我现在就是在CurdBefore把EntityType扔AsyncLocal里,再在CommandBefore中取,确实可以满足大部分情况。
只是有时候通过Ado来运行sql的话会跳过CurdBefore,那就想不到好办法传类型参数了。(这么说,最好在IAdo也加一个.WithData(string key, object value)才行)
之前也试过封装一个Repository,构造函数中往AsyncLocal里扔Repository Type,但是有一定概率在CommandBefore取出时丢失。
而且遇到同时用多个Repository也是个问题。