Это похоже на проблему дизайна, скрытую за XY проблемой .
Служба ведения журналов нуждается в некотором рефакторинге, чтобы упростить внедрение желаемого поведения.
представляет дополнительный универсальный интерфейс, производный от базового ILoggingService
public interface ILoggingService<TType> : ILoggingService {
}
public interface ILoggingService {
void FirstLevelServiceLog(string log);
}
рефакторинг текущей реализации в зависимости от общей версии сервиса
public class LoggingService<TType> : ILoggingService<TType> {
private readonly ILogger _logger;
public LoggingService() {
string currentClassName = typeof(TType).Name;
_logger = LogManager.GetLogger(currentClassName);
}
public void FirstLevelServiceLog(string log) {
_logger.Log(LogLevel.Debug, log);
}
}
Это позволит использовать аргумент типа для определения имени класса для менеджера журналов
Теперь те, кто зависят от службы ведения журналов, могут явно указывать на свою зависимость через внедрение конструктора
public class MyService : IMyService {
private readonly ILoggingService _loggingService;
public MyService(ILoggingService<MyService> loggingService) {
_loggingService = loggingService
}
public DoSomething() {
_loggingService.FirstLevelServiceLog("Debug");
}
}
Обратите внимание, что единственное, что нужно было для рефакторинга, это общий аргумент для конструктора, так как универсальный регистраторполучено из базы ILoggingService
.
Абстракция службы ведения журнала может быть наконец зарегистрирована с использованием открытых обобщений для ее реализации
var container = new UnityContainer();
container.RegisterType(typeof(ILoggingService<>), typeof(LoggingService<>));
Таким образом, нет необходимости регистрировать отдельную реализацию для каждойрегистратор, используемый в системе.