Вы можете сделать следующее:
- Создайте реализацию Proxy (например,
ProxyLogger
), которая реализует ILogger
, содержит свойство ILogger Logger
и перенаправляет любой вызов этого свойства.
- Зарегистрируйте этот прокси как
ILogger
и ProxyLogger
как Lifestyle.Scoped
.
- Разрешите
ProxyLogger
в пределах вашей функции.
- Установите
ProxyLogger.Logger
, используя функцию ILogger
.
- Разрешить корневой объект и использовать его.
Создать прокси:
public class ProxyLogger : ILogger
{
public ILogger Logger { get; set; }
public void Log<TState>(LogLevel l, EventId id, TState s, Exception ex,
Func<TState,Exception,String> f) =>
this.Logger.Log<TState>(l, id, s, ex, f);
// Implement other functions
}
Зарегистрируйте этот прокси:
container.Register<ProxyLogger>(Lifestyle.Scoped);
container.Register<ILogger, ProxyLogger>(Lifestyle.Scoped);
Разрешите ProxyLogger
в вашей функции, установите ProxyLogger.Logger
, используя предоставленную функцией ILogger
, и разрешите корневой объект и используйте его.
public static Task Run(Message message, ILogger logger)
{
using (AsyncScopedLifestyle.BeginScope(Main.Container)
{
Main.Container.GetInstance<ProxyLogger>().Logger = logger;
var controller = Main.Container.GetInstance<ConsumerController>();
return controller.Execute(message);
}
}
Однако я думаю, что эта модель приводит к очень большому количеству инфраструктурного кода. Желательно, чтобы вы хотели сохранить эту инфраструктуру до абсолютного минимума. Вместо этого вы можете попытаться сохранить свои функции Azure небольшими скромными объектами, как описано здесь . Это может не полностью решить вашу первоначальную проблему, но вам, возможно, не понадобится логер для конкретного метода. Но если, с другой стороны, вам это нужно, вы можете смешать подход Humble Object с использованием атрибута CallerMemberName в C # и подхода ProxyLogger
. Вам действительно не нужно вводить Azure ILogger
, чтобы сделать это за вас.