Я использую средство регистрации Замка с log4net в моем приложении (веб-приложение MVC3). Однако вместо непосредственного использования интерфейса ILogger я абстрагировал его, создав другой интерфейс (IAuditor) с конкретной реализацией Log4NetAuditor (см. Код ниже).
Вы можете спросить, почему я это сделал, поскольку цель ILogger - абстрагировать базовую реализацию протоколирования. Я сделал это из-за строгого соблюдения принципа onion для абстрагирования всех проблем инфраструктуры.
Теперь это работает просто отлично, за исключением того, что все регистраторы имеют одинаковые имена: MyProject.Infrastructure.Log4NetAuditor:
2011-01-24 13:26:11,746 [11] DEBUG MyProject.Infrastructure.Log4NetAuditor [] - Attempting login...
2011-01-24 13:26:11,845 [11] DEBUG MyProject.Infrastructure.Log4NetAuditor [] - Authentication result is Authenticated
IAuditor предоставляется как свойство AuditableComponent, являющегося абстрактным классом, из которого происходят все компоненты, требующие ведения журнала.
public abstract class AuditableComponent
{
private IAuditor _auditor = NullAuditor.Instance;
public IAuditor Auditor
{
get { return _auditor; }
set { _auditor = value; }
}
//....
}
Класс Log4NetAuditor выглядит следующим образом:
public class Log4NetAuditor : IAuditor
{
private ILogger _logger = NullLogger.Instance;
public ILogger Logger
{
get { return _logger; }
set { _logger = value; }
}
public void Trace(string message)
{
_logger.Debug(message);
}
}
Теперь понятно, почему все операторы журнала имеют одно и то же имя регистратора: ILogger внедряется в класс Log4NetAuditor.
Как же тогда я могу убедиться, что имя регистратора соответствует имени класса, расширяющего AuditableComponent?