Тип проводки autofac к моему логгеру - PullRequest
0 голосов
/ 16 мая 2018

У меня есть регистратор следующим образом:

public class Logger : ILogger
{ 
    private ILogger _logger;

    public Logger(Type type)
    { 
        _logger =  LogManager.CreateLogger(type);
    }
     .... removed

Я пытаюсь построить модуль журнала:

public class LogModule : Autofac.Module
{       
    protected override void Load(ContainerBuilder builder)
    {
        const string propertyNameKey = "Autofac.AutowiringPropertyInjector.InstanceType";


        builder.RegisterType<Logger>().As<ILogger>();
        base.Load(builder);
    }
}

Я должен найти и ввести тип в Logger, что-то вроде , которое задает этот вопрос, но этот вопрос делает инъекцию свойства, мне нужно инъекцию ctor.

Как я могу получить контекстную регистрацию, т. Е. Запись по типу?

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать Preparing объекта регистрации.Этот код взят со страницы autofac .

public class LoggingModule : Autofac.Module
{

    private static void InjectLoggerProperties(object instance)
    {
        var instanceType = instance.GetType();

        // Get all the injectable properties to set.
        // If you wanted to ensure the properties were only UNSET properties,
        // here's where you'd do it.
        var properties = instanceType
          .GetProperties(BindingFlags.Public | BindingFlags.Instance)
          .Where(p => p.PropertyType == typeof(ILog) && p.CanWrite && p.GetIndexParameters().Length == 0);

        // Set the properties located.
        foreach (var propToSet in properties)
        {
            propToSet.SetValue(instance, LogManager.GetLogger(instanceType), null);
        }
    }

    private static void OnComponentPreparing(object sender, PreparingEventArgs e)
    {
        e.Parameters = e.Parameters.Union(
          new[]
          {
             new ResolvedParameter(
                (p, i) => p.ParameterType == typeof(ILog),
                (p, i) => LogManager.GetLogger(p.Member.DeclaringType)
             ),
          });
    }

    protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
    {
        // Handle constructor parameters.
        registration.Preparing += OnComponentPreparing;

        // Handle properties.
        registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
    }
}

Этот код:

private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
    e.Parameters = e.Parameters.Union(
      new[]
      {
         new ResolvedParameter(
            (p, i) => p.ParameterType == typeof(ILog),
            (p, i) => LogManager.GetLogger(p.Member.DeclaringType)
         ),
      });
}

вводит новый регистратор (используя имя класса) в CTOR.

class ClassA 
{
    ... 
    ClassA(ILog logger) => this.logger = logger; // logger was created by Autofac via LogManager.GetLogger("ClassA")
}

Надеюсь, это то, что вы ищете.

...