c# - 如何在 c# Azure Function 项目中的多个类中重用 ILogger?

标签 c# function azure

使用 Visual Studio 2017 构建 C# Azure Function v2 项目。 我只定义了一个函数,但在 HTTP 触发执行期间会实例化多个类。大部分是我自己的代码,一些是 JSON 反序列化(因此无法控制如何调用构造函数)。

函数方法签名接收我用于记录的 ILogger 实例。 让我的所有类实例使用同一个 ILogger 实例,而不必将 ILogger 传递给每个类实例化的最佳方法是什么?

我知道使用静态变量是不可能的,因为它们在不同的函数调用之间共享,而每个调用都会接收另一个 ILogger 实例。

此外,依赖注入(inject)似乎在这里没有到位,因为这些类仅在内部使用,除了 JSON 反序列化类之外。

以下是我总结的代码。 我可以将 ILogger 传递给 MyClass 构造函数,但 myClass.PerformTheTask() 执行使用和实例化多个类的复杂代码,所有这些都需要记录内容。

这里最好的方法是什么?

[FunctionName("FunctionName")]
public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "someroute{route}")] HttpRequest req,
        ILogger log,
        ExecutionContext context)
{
    var myClass = new myClass(); //how to make myClass and its children access ILogger?
    myClass.PerformTheTask();
}

最佳答案

@EricG,

正如 Fredrik 所说,您可以在现在支持的 Azure Function V2 中使用依赖注入(inject)。Azure Functions 构建在 ASP.NET Core 依赖注入(inject)功能之上。

您可以在此处和 git repo 中找到 Azure 示例。供引用。

它非常容易使用,也更干净。它使用构造函数注入(inject)来注入(inject)依赖项。

public class SampleFunction
    {
        private readonly MyServiceA _serviceA;
        private readonly MyServiceB _serviceB;
        private readonly IGlobalIdProvider _globalIdProvider;

        public SampleFunction(MyServiceA serviceA, MyServiceB serviceB, IGlobalIdProvider globalIdProvider)
        {
            _serviceA = serviceA ?? throw new ArgumentNullException(nameof(serviceA));
            _serviceB = serviceB ?? throw new ArgumentNullException(nameof(serviceB));
            _globalIdProvider = globalIdProvider ?? throw new ArgumentNullException(nameof(globalIdProvider));
        }

        [FunctionName("SampleFunction")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation($"Service A ID: {_serviceA.IdProvider.Id}. Service B ID: {_serviceB.IdProvider.Id}");

            return new OkObjectResult(new
            {
                ProvidersMatch = ReferenceEquals(_serviceA.IdProvider, _serviceB.IdProvider),
                GlobalId = _globalIdProvider.Id,
                ServiceAId = _serviceA.IdProvider.Id,
                ServiceBId = _serviceB.IdProvider.Id
            });
        }
    }

类似地,您可以使用 ILogger 来完成此操作并在类中使用它。希望对您有所帮助。

关于c# - 如何在 c# Azure Function 项目中的多个类中重用 ILogger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56563047/

相关文章:

c# - 为所有关键字字段NEST添加规范化器

c - 将参数结构传递给 C 中的函数

java - [Azure][适用于 Java 的 Application Insights 代理]java.lang.NoClassDefFoundError : http/RequestLine

java - 尝试查看数据时,Azure Android CloudAppendBlob 导致错误 409(冲突)

c# - 在调用 Read() 之前访问字段的尝试无效

c# - 有没有一种简单的方法可以让 ClassLibrary 获取 session 值?

c# - 用多线程写入excel文件

php - 将在自动加载的命名空间类文件中声明的函数创建为全局函数

javascript - 如何格式化 setInterval 方法 JavaScript 的耗时

Azure 应用程序网关 - 基于 cookie 值的路由