繁体   English   中英

获取 .net 核心中注入服务的调用者信息

[英]Get caller info for injected service in .net core

如果我将这些属性应用于某些服务然后将其注入 DI,我正在尝试找出将使用哪个CallerMemberNameCallerFilePath值。 例如:

public class MyService: IMyService
{
    public MyService([CallerMemberName] string name = null)
    {
        var name = name; // name is always null here
    }
}

...

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService, MyService>();
    }
}

所以,我想,是name变量的预期值还是我做错了什么? 在这种情况下,我该如何使用CallerMemberName 有可能吗?

如果我将这些属性应用于某些服务然后将其注入 DI,我正在尝试找出将使用哪个CallerMemberNameCallerFilePath值。

你不能。 您的方法行不通,因为 ASP.NET Core ( Microsoft.Extensions.DependencyInjection ) 使用的默认 DI 系统使用动态注册,这意味着 AOT (C#-to-IL) 和 JIT (IL-to-x64) 编译器都不知道任何关于DI 服务的消费者(请注意,虽然注册在概念上是static并且只能在启动时执行 - 这只是一种错觉:您可以在运行时轻松破解默认 DI 容器)。

作为补充:您的方法唯一可行的情况是,如果您有某种代码生成系统来在构建时创建您的对象工厂和服务工厂,而不使用任何运行时反射或 IL 生成。 在实践中,您看到该方法的唯一地方是在单元测试代码中使用它,在这些代码中测试需要严格控制每个依赖项——但它们通常是手工编写的,而且非常乏味和脆弱。 通过 Roslyn 代码生成,我希望看到static服务工厂开始被更多地使用,因为它为您提供了编译时保证每个依赖项都可用 - 这样您就不会在运行时遇到任何关于缺少依赖项的令人讨厌的意外。

[CallerMemberName][CallerFilePath]属性由 AOT 编译器而非 JIT 编译器填充,即使是由 JIT 编译器填充也无济于事,因为DI 服务的使用者不是服务构造函数的调用者

难道我做错了什么?

你是。 由于我上面描述的原因。

在这种情况下,我该如何使用CallerMemberName

你不能。 CallerMemberNameAttribute不适用于此目的。 它旨在用于快速简便的日志记录、分析和跟踪。

有可能吗?

是 - 通过正确扩展Microsoft.Extensions.DependencyInjection 请阅读 MEDI 文档以获取更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM