Autofac: enregistrer le composant et le résoudre en fonction de la résolution du parent

Je souhaite enregistrer un composant à résoudre avec des parameters basés sur la classe pour laquelle il est susceptible de se résoudre. (Cela semble un peu déroutant, alors je vais montrer un exemple).

Voici un object qui utilise un enregistreur:

class MyObject : IMyObject { public ILogger Logger; public MyObject(ILogger logger) { Logger = logger; } } 

Maintenant, l’enregistreur qui est passé dans POURRAIT être différent d’une classe à l’autre. J’ai donc une idée assez corrigée pour savoir comment faire cela ci-dessous:

 class MyLogger : ILogger { public ssortingng Name{get; protected set;} public static ILogger GetLogger(ssortingng className) { Name = className; MyLogger logger; // Do something to choose a logger for that specific class return logger; } } 

Ainsi, lorsque je vais enregistrer Logger, je veux pouvoir lui donner le nom de classe. J’espère qu’il y a un moyen de le faire semblable à ceci:

 ContainerBuilder builder = new ContainerBuilder(); builder.Register(ctx => { ssortingng className = //Get resolving class name somehow; return MyLogger.GetLogger(className); }).As(); builder.Register().As(); var container = builder.Build(); IMyObject myObj = container.Resolve(); //myObject.Logger.Name should now == "MyObject" 

La raison pour laquelle je veux le faire de cette façon est d’éviter d’inscrire chaque classe que j’implémente avec un enregistreur avec autofac en code. Je veux pouvoir enregistrer tous les objects au format XML et simplement avoir un LoggerModule, qui ajoute cet enregistrement.

Merci d’avance!

    Voici ce que je fais (ILog est juste mon propre wrapper autour de log4net):

     public class LoggingModule : Module { protected override void Load(ContainerBuilder builder) { builder.Register((c, p) => GetLogger(p.TypedAs())); } protected override void AttachToComponentRegistration( IComponentRegistry registry, 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(TypedParameter.From(forType))); args.Parameters = args.Parameters.Union(new[] {logParameter}); }; } public static ILog GetLogger(Type type) { return new Log4NetLogger(type); } } public interface ILog { void Debug(ssortingng format, params object[] args); void Info(ssortingng format, params object[] args); void Warn(ssortingng format, params object[] args); void Error(ssortingng format, params object[] args); void Error(Exception ex); void Error(Exception ex, ssortingng format, params object[] args); void Fatal(Exception ex, ssortingng format, params object[] args); } public class Log4NetLogger : ILog { private readonly log4net.ILog _log; static Log4NetLogger() { XmlConfigurator.Configure(); } public Log4NetLogger(Type type) { _log = LogManager.GetLogger(type); } public void Debug(ssortingng format, params object[] args) { _log.DebugFormat(format, args); } public void Info(ssortingng format, params object[] args) { _log.InfoFormat(format, args); } public void Warn(ssortingng format, params object[] args) { _log.WarnFormat(format, args); } public void Error(ssortingng format, params object[] args) { _log.ErrorFormat(format, args); } public void Error(Exception ex) { _log.Error("", ex); } public void Error(Exception ex, ssortingng format, params object[] args) { _log.Error(ssortingng.Format(format, args), ex); } public void Fatal(Exception ex, ssortingng format, params object[] args) { _log.Fatal(ssortingng.Format(format, args), ex); } }