CSharpAtl
Мне интересно, как именно вы вводите Log4net? Смотрите мой вопрос / сообщество вики здесь .
Я также видел ваш ответ на вопрос DI / Log4net здесь .
В большинстве примеров внедрения журналирования, которые я видел, показан класс с внедренным «регистратором», что-то вроде этого:
public class Foo
{
private ILogger logger;
public Foo(ILogger logger) //Injection via constructor
{
//Which "named" logger is this anyway? Is it Foo's? If so, how is it Foo's?
this.logger = logger;
}
public DoSomeWork(int xyz)
{
logger.Info("xyz = {0}", xyz);
}
}
Используя что-то вроде Log4net (и NLog, а может и других), вы обычно создаете регистратор, подобный этому:
public class Foo
{
private static ILogger logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public Foo()
{
}
public DoSomeWork(int xyz)
{
logger.Info("xyz = {0}", xyz);
}
}
Итак, как мой класс, Foo, получает правильный логгер, если я ввожу зависимость? Кроме того, возможно я не называю свои регистраторы, основанные строго на классе. Скорее, я мог бы назвать их в зависимости от функциональной области (например, «DatabaseAccess», «AppStartup», «AppShutdown» и т. Д.), Которая может не быть производной от типа.
Вы вводите "Logger" (который соответствует названному logger) или "LogManager" (который соответствует LogManager Log4net), или вы делаете что-то еще? Используете ли вы возможность конфигурации платформы DI для связи «именованных экземпляров» внедренных зависимостей? Я думаю, что Unity поддерживает что-то вроде этого, хотя я не совсем уверен.
Вот как я мог бы представить введение LogManager:
public class Foo
{
private static ILogger logger;
public Foo(ILogManager logManager) //Injection via constructor
{
logger = logManager.GetLogger
(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
//Since logger is (should it be?) static, maybe should be like this:
if (logger = null)
{
logManager.GetLogger
(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
}
}
public DoSomeWork(int xyz)
{
logger.Info("xyz = {0}", xyz);
}
}
Мне кажется, что внедрение чего-то вроде ILogManager (реализация которого обернула бы LogManager Log4net) было бы проще, чем внедрение ILogger, из-за вопроса о том, как платформа DI узнает, какой ILogger ввести.
Я новичок в платформах регистрации DI и .NET (и вообще, довольно плохо знаком с C # и .NET в целом). Подавляющее большинство моего опыта за последние много лет это VB6 + VC ++ 6.
Спасибо за ЛЮБУЮ информацию ...
Начать редактирование ...
Я еще раз посмотрел на SO и обнаружил, что вы также спрашивали об AutoFac, поэтому я предполагаю, что вы используете это для своего DI. Если это правда, то я думаю, что вы также делаете что-то вроде this или, видимо, даже лучше, например this для разрешения вашего регистратора (по типу класса). Я предполагаю, что это отвечает на вопрос, как, по крайней мере в AutoFac, вводить именованные регистраторы (например, из Log4Net или NLog).
Конец редактирования ...