Наличие собственного регистратора
Проект лесозаготовок
public interface ILogger {
void LogMessage(string msg);
}
чтобы не связывать ваш код со сторонним регистратором - хорошая идея.
Корневой проект
public class Log4NetWrapper : ILogger {
private readonly ILog log; //log4net
public Log4NetWrapper(ILog log) {
this.log = log;
}
public void LogMessage(string msg) {
log.Info(msg);
}
//...
}
Осталось только зарегистрировать свой собственный регистратор вместе с сторонним расширением контейнера в корне композиции.
Проект Root (Композиция Root)
container = new UnityContainer();
//...
container.AddNewExtension<Log4NetExtension>();
//...
container.RegisterType<ILogger, Log4NetWrapper>(new HierarchicalLifetimeManager());
И используйте ваш внутренний регистратор, где это необходимо, в разных слоях.
public MyService(ILogger log) {
//...
}
при использовании этой абстракции другим слоям не нужно знать, что используется за сценой для ведения журнала.
Только корень композиции должен знать о сторонней зависимости, чтобы зарегистрировать ее в контейнере IoC.