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

时间:2019-06-12 13:09:47

标签: c# function azure

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

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

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

此外,在这里似乎没有依赖注入,因为除了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();
}

1 个答案:

答案 0 :(得分:0)

@EricG,

正如Fredrik正确地说的那样,您可以在现已支持的Azure函数V2中使用依赖注入.Azure函数建立在ASP.NET Core依赖注入功能之上。

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

它非常易于使用并且更清洁。它使用构造函数注入来注入依赖项。

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进行操作,并在类中使用它。希望对您有所帮助。