inversionhourglass/Rougamo

关于 MoAttribute 中获取 IServiceProvider 对象的问题

2881099 opened this issue · 13 comments

最近接触 blazor SSR,使用 AsyncLocal 的方式存储 IServiceProvider 不再凑效了。

blazor SSR 的特点是长连接,ioc Scoped 正常使用没问题,AsyncLocal 在这种模式下很容易丢失上下文,原因是长链接各种异步 UI 操作,一言难尽。

希望肉夹馍提供与 IServiceProvider 设置有关的方式。

例如按照约定方法:

public class xxx
{
    IServiceProvider Service; // Rougamo 内部获取这个字段或属性

    [XxxMo]
    public void xxx() {}
}

class XxxMo : MoAttrite
{
    public override void OnEntry(MethodContext context)
    {
        var service = context.GetService(); //按照约定方式
    }
}
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);
    }
}

已解决,谢谢。

反馈一下问题,关于泛型下 TargetType 使用 Mo 的处理:

new MethodContext(this, typeof(Xxx<>)

TargetType 使用的不是 typeof(Xxx<int>)

感谢反馈,稍后将进行修复

回顾了一下代码,TargetType这样的表现不是bug,TargetType是编译时获取的定义的类型本身,无法得知使用时的泛型类型参数,如果需要获取包含泛型类型参数的实际类型,需要通过Target.GetType()来获取了。需要注意的是,如果方法时静态方法,Targetnull