FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

CommandBeforeEventArgs 和 CommandBeforeEventArgs 的 States能否使用同一实例

Open tky753 opened this issue 4 years ago • 4 comments

Feature 特性

CurdBeforeEventArgs CommandBeforeEventArgs CommandAfterEventArgs CurdAfterEventArgs 这几个args的States属性能否使用同一个实例?这样可以在不同事件间传递状态。

使用场景

CurdBefore事件中获取到EntityType放进states, 然后在CommandBefore事件中取出来,用EntityType去创建logger实例记录sql到日志 然后就可以根据这个EntityType在配置中过滤,有些实体比如审计日志不要记录。

tky753 avatar Dec 18 '21 07:12 tky753

CurdBeforeEventArgs CurdAfterEventArgs 这两个是共享的。


CommandBeforeEventArgs CommandAfterEventArgs 这两个是共享的。

2881099 avatar Dec 27 '21 13:12 2881099

如果这个states能打通 Curd和Command事件,


更进一步, 可以考虑在ISelectIDeleteIInsertIUpdate中 加个方法: .WithData(string key, object value) 往这个states里加数据,那就可以达到依赖注入的效果了有没有。 比如可以 .WithData("log", logger) inject logger, 然后在CommandBeforeEventArgs中resolve这个logger来写日志。

tky753 avatar Dec 28 '21 06:12 tky753

关于 依赖注入的对象,往 AsyncLocal 里面扔也是可以达到目的

2881099 avatar Jan 03 '22 13:01 2881099

我现在就是在CurdBeforeEntityTypeAsyncLocal里,再在CommandBefore中取,确实可以满足大部分情况。 只是有时候通过Ado来运行sql的话会跳过CurdBefore,那就想不到好办法传类型参数了。(这么说,最好在IAdo也加一个.WithData(string key, object value)才行)


之前也试过封装一个Repository,构造函数中往AsyncLocal里扔Repository Type,但是有一定概率在CommandBefore取出时丢失。 而且遇到同时用多个Repository也是个问题。

tky753 avatar Jan 04 '22 03:01 tky753