关于 MoAttribute 中获取 IServiceProvider 对象的问题
2881099 opened this issue · 13 comments
2881099 commented
最近接触 blazor SSR,使用 AsyncLocal 的方式存储 IServiceProvider 不再凑效了。
blazor SSR 的特点是长连接,ioc Scoped 正常使用没问题,AsyncLocal 在这种模式下很容易丢失上下文,原因是长链接各种异步 UI 操作,一言难尽。
希望肉夹馍提供与 IServiceProvider 设置有关的方式。
2881099 commented
例如按照约定方法:
public class xxx
{
IServiceProvider Service; // Rougamo 内部获取这个字段或属性
[XxxMo]
public void xxx() {}
}
class XxxMo : MoAttrite
{
public override void OnEntry(MethodContext context)
{
var service = context.GetService(); //按照约定方式
}
}
2881099 commented
class XxxMo : MoAttrite
{
public override void OnEntry(MethodContext context)
{
var prop = context.TargetType.GetProperty("ServiceProvider", BindingFlags.Public | BindingFlags.NonPublic);
if (prop == null) throw new Exception($"{context.TargetType.DisplayCsharp()} 未定义 IServiceProvider ServiceProvider {{ get; set; }}");
var service = prop.GetValue(context.Target);
}
}
已解决,谢谢。
2881099 commented
反馈一下问题,关于泛型下 TargetType 使用 Mo 的处理:
new MethodContext(this, typeof(Xxx<>)
TargetType 使用的不是 typeof(Xxx<int>)
inversionhourglass commented
感谢反馈,稍后将进行修复
inversionhourglass commented
回顾了一下代码,TargetType这样的表现不是bug,TargetType是编译时获取的定义的类型本身,无法得知使用时的泛型类型参数,如果需要获取包含泛型类型参数的实际类型,需要通过Target.GetType()
来获取了。需要注意的是,如果方法时静态方法,Target
为null