Я все еще довольно новичок в Autofac и Nlog, и мне нужна помощь в понимании того, что происходит в моем модуле Autofac LoggingModule для Nlog.Он работает, как и ожидалось, благодаря injecting-nlog-with-autofacs-registergeneric .Но вместо того, чтобы просто копировать вставку, я хотел бы убедиться, что я понимаю, что происходит в каждом методе ( Загрузка & AttachToComponentRegistration ),Если бы вы могли пересмотреть мои мысли и уточнить, что я ошибаюсь (я уверен, что это немного), я был бы очень признателен.Заранее спасибо!
- Цель базы данных с использованием Nlog
- Внедрение зависимостей с использованием Autofac
- ASP.NET MVC веб-приложение для обучения
- Dvd Libaryприложение (DvdAdd, DvdEdit, DvdDelete, DvdList)
LoggingModule
public class LoggingModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder
.Register((c, p) => new LogService(p.TypedAs<Type>()))
.AsImplementedInterfaces();
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing +=
(sender, args) =>
{
var forType = args.Component.Activator.LimitType;
var logParameter = new ResolvedParameter(
(p, c) => p.ParameterType == typeof(ILog),
(p, c) => c.Resolve<ILog>(TypedParameter.From(forType)));
args.Parameters = args.Parameters.Union(new[] { logParameter });
};
}
}
Мое понимание кода в Load()
c - параметр c , предоставленный выражению, является контекстом компонента (объектом IComponentContext), в котором создается компонент.Контекст, в котором можно получить доступ к службе или разрешить зависимости компонента.
p - IEnumerable с набором входящих параметров
AsImplementedInterfaces - Autofac позволяет своим пользователям регистрировать типы явно или неявно.В то время как « As » используется для явных регистраций, « AsImplementedInterfaces » и « AsSelf » используются для неявных.Другими словами, контейнер автоматически регистрирует реализацию для всех реализуемых им интерфейсов.
Мысли: Код метода Load регистрирует новый класс LogService (который представляет " c * 1060").* ") с типом регистратора (который представляет" p") в качестве параметра конструктора для класса LogService
Вопросы:
- Правильны ли мои мысли выше?
- Должно ли это быть SingleInstance или оно будет / будет жить так долго, как область действия вызывающих классов?(Я думаю о своей единице работы)
Мое понимание кода в AttachToComponentRegistration()
AttachToComponentRegistration Метод - Переопределить, чтобы прикрепить функциональность, специфичную для модуля, к регистрации компонента.
AttachToComponentRegistration Параметры:
- IComponentRegistry componentRegistry - обеспечивает регистрацию компонентов в соответствии с предоставляемыми ими услугами.
- IComponentRegistration регистрация - описывает логический компонент в контейнере.
регистрация. Подготовка - Запускается, когда требуется новый экземпляр.Экземпляр можно предоставить, чтобы пропустить обычный активатор, установив свойство Instance в предоставленных аргументах события.
var forType = args.Component.Activator.LimitType;
args = Autofac.Core.PreparingEventArgs - Запускается перед процессом активации, чтобы разрешить изменение параметров или предоставление альтернативного экземпляра.
Компонент = PreparingEventArgs.Component Свойство - Получает компонент, обеспечивающий активируемый экземпляр
Активатор = IComponentRegistration.Activator Property - Получает активатор, используемый для создания экземпляров.
LimitType = IInstanceActivator.LimitType Свойство - получает наиболее конкретный тип, которым являются экземпляры компонентаизвестно, что оно может быть преобразовано в.
Мысли в forType
- Насколько я понимаю, эта переменная содержит Name
и FullName
вызывающего класса, с которого ведется логированиеВызывается ce?
Изображение отладчика forType
Вопросы:
- Правильны ли мои мысли
forType
?
var logParameter = new ResolvedParameter(
(p, c) => p.ParameterType == typeof(ILog),
(p, c) => c.Resolve<ILog>(TypedParameter.From(forType)));
ResolvedParameter - может использоваться как способ предоставления значений, динамически извлекаемых из контейнера, например, путем разрешения службы по имени.
Мысли о logParameter
- Здесь я начинаю заблудиться.Так что он проверяет, что параметр имеет тип ILog, и если это так, то он разрешает его с помощью параметра конструктора и передает переменную forType
?
Вопросы:
- Верны ли мои мысли о
logParameter
выше?
args.Parameters = args.Parameters.Union(new[] { logParameter });
args.Parameters = PreparingEventArgs.Parameters Свойство - получает или задает параметры, передаваемые активатору.
args.Parameters.Union = Создает объединение наборов из двух последовательностей с использованием компаратора сравнения по умолчанию.Возвращает System.Collections.Generic.IEnumerable`1 , который содержит элементы из обеих входных последовательностей, исключая дубликаты.
Мысли о args.Parameters
- я действительно не знаю, на данный момент, другиечем догадываться, что он возвращает коллекцию параметров и удаляет дубликаты?
Вопросы:
- Не могли бы вы помочь мне рассказать, что происходит в * 1216?*?
Изображение отладчика logParameter Изображение таблицы базы данных Nlog
Класс LogService
public class LogService : ILog
{
private readonly ILogger _log;
public LogService(Type type)
{
_log = LogManager.GetLogger(type.FullName);
}
public void Debug(string message, params object[] args)
{
Log(LogLevel.Debug, message, args);
}
public void Info(string message, params object[] args)
{
Log(LogLevel.Info, message, args);
}
public void Warn(string message, params object[] args)
{
Log(LogLevel.Warn, message, args);
}
public void Error(string message, params object[] args)
{
Log(LogLevel.Error, message, args);
}
public void Error(Exception ex)
{
Log(LogLevel.Error, null, null, ex);
}
public void Error(Exception ex, string message, params object[] args)
{
Log(LogLevel.Error, message, args, ex);
}
public void Fatal(Exception ex, string message, params object[] args)
{
Log(LogLevel.Fatal, message, args, ex);
}
private void Log(LogLevel level, string message, object[] args)
{
_log.Log(typeof(LogService), new LogEventInfo(level, _log.Name, null, message, args));
}
private void Log(LogLevel level, string message, object[] args, Exception ex)
{
_log.Log(typeof(LogService), new LogEventInfo(level, _log.Name, null, message, args, ex));
}
}
Интерфейс ILog
public interface ILog
{
void Debug(string message, params object[] args);
void Info(string message, params object[] args);
void Warn(string message, params object[] args);
void Error(string message, params object[] args);
void Error(Exception ex);
void Error(Exception ex, string message, params object[] args);
void Fatal(Exception ex, string message, params object[] args);
}