Вы можете обернуть TelemetryClient
следующим образом:
public interface ILogsStuff
{
void LogSomething(string message);
}
public class TelemetryClientLogger : ILogsStuff, IDisposable
{
private readonly TelemetryClient _telemetryClient;
public TelemetryClientLogger(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
public void LogSomething(string message)
{
_telemetryClient.TrackTrace(message);
}
public void Dispose()
{
_telemetryClient.Flush();
}
}
Есть дополнительное преимущество, заключающееся в том, что любой класс, в который вы вводите это, не будет напрямую зависеть от TelemetryClient
.Вы можете определить интерфейс, который описывает то, для чего вы хотите использовать клиент, и его легче и смоделировать, и при необходимости заменить на какую-то другую реализацию.
Было выдвинуто предложение , чтобы сделать TelemetryClient
внедрить IDisposable
и заставить его вызвать Flush()
при утилизации, и это было рекомендуемое решение.
В обновлении вашего вопроса сказано:
Мне нужнопередать TelemetryClient методу стороннего метода, чтобы я не мог использовать обертку.
Это несколько меняет ситуацию, так как теперь нет намерения использовать TelemetryClient
но разрешить его и затем передать его в метод сторонней библиотеки.Это необычно, потому что это означает, что эта библиотека заставляет код, использующий ее, иметь жесткую зависимость от TelemetryClient
, а затем, по-видимому, не обрабатывает этот клиент, как ожидалось.
На данный момент есть еще решения, новсе они безобразны, потому что они являются решением странной проблемы, которая не должна существовать (и не была создана вашим кодом).
Если вы передаете TelemetryClient
методу, этот метод записываетк нему, а затем он должен быть сброшен, почему эта библиотека не сбрасывает его?
Вы, вероятно, можете решить эту проблему, передав TelemetryClient
методу при его выполнении, а затем сбросив клиент послеметод выполняется.
CallSomeMethod(someArgument, _telemtryClient);
telemetryClient.Flush();
Или, чтобы приблизить результат к вашему вопросу, вы можете сделать это, что бы получить результат, но все еще неуклюже и странно:
public class TelemetryClientWrapper : IDisposable
{
private readonly TelemetryClient _telemetryClient;
public TelemetryClientWrapper(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
public TelemetryClient Client => _telemetryClient;
public void Dispose()
{
_telemetryClient.Flush();
}
}
Вы можете добавить этоКласс и передать его в метод библиотеки следующим образом:
CallSomeMethod(someArgument, _telemtryClientWrapper.Client);
Проблема в том, что ваш класс имеет жесткую зависимость от TelemetryClient
, даже если он не использует его ,все это может исправить то, что другая библиотека (предположительно) не делает правильно с этим клиентом.
Сказав все это, возможно, в вашем сценарии это ответ :
Встроенный сервисный контейнер предназначен для удовлетворения потребностейрамки и большинство потребительских приложений.Мы рекомендуем использовать встроенный контейнер, если вам не нужна особая функция, которую он не поддерживает.Некоторые функции, поддерживаемые в сторонних контейнерах, отсутствуют во встроенном контейнере:
Другими словами, если вам нужно то, что делает Autofac, вы можете по-прежнему использовать Autofac сIServiceCollection
.