У меня есть простое тестовое приложение winform, которое я использую, чтобы попробовать некоторые вещи для внедрения зависимостей Log4Net.
В моем проекте Services я создал простой интерфейс: -
public interface ILogging
{
void Debug(string message);
// snip the other's.
}
Тогда мой конкретный тип будет использовать Log4Net ...
public class Log4NetLogging : ILogging
{
private static ILog Log4Net
{
get { return LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType); }
}
public void Debug(string message)
{
if (Log4Net.IsDebugEnabled)
{
Log4Net.Debug(message);
}
}
}
Пока все хорошо. Там нет ничего сложного.
Теперь, в другом проекте (и, следовательно, namesapce), я пытаюсь использовать это ...
public partial class Form1 : Form
{
public Form1()
{
FileInfo fileInfo = new FileInfo("Log4Net.config");
log4net.Config.XmlConfigurator.Configure(fileInfo);
}
private void Foo()
{
// This would be handled with DI, but i've not set it up
// (on the constructor, in this code example).
ILogging logging = new Log4NetLogging();
logging.Debug("Test message");
}
}
Хорошо, тоже довольно просто. Я жестко запрограммировал экземпляр ILogging, но обычно это зависимость, внедряемая через конструктор. В любом случае, когда я проверяю эту строку кода ...
return LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
значение типа DeclaringType
относится к пространству имен Service , а не к типу Form (т.е. X.Y.Z.Form1), который фактически вызвал метод.
Не передавая метод типа INTO в качестве другого аргумента, есть ли в любом случае отражение для определения метода real
, который его вызвал?