Estoy queriendo registrar un componente para resolver con parámetros basados en la clase que podría estar resolviendo. (Eso suena un poco confuso, entonces mostraré un ejemplo).Autofac: componente de registro y resolución según resolver padre
Aquí es un objeto que utiliza un registrador:
class MyObject : IMyObject
{
public ILogger Logger;
public MyObject(ILogger logger)
{
Logger = logger;
}
}
Ahora el registrador que se pasa podría ser diferente de una clase a otra. Así que tengo una idea bastante parcheado de cómo hacerlo a continuación:
class MyLogger : ILogger
{
public string Name{get; protected set;}
public static ILogger GetLogger(string className)
{
Name = className;
MyLogger logger;
// Do something to choose a logger for that specific class
return logger;
}
}
Así que cuando me registro Logger Quiero ser capaz de decir que el className. Estoy esperando que hay una manera de hacerlo similar a esto:
ContainerBuilder builder = new ContainerBuilder();
builder.Register<MyLogger>(ctx =>
{
string className = //Get resolving class name somehow;
return MyLogger.GetLogger(className);
}).As<ILogger>();
builder.Register<MyObject>().As<IMyObject>();
var container = builder.Build();
IMyObject myObj = container.Resolve<IMyObject>();
//myObject.Logger.Name should now == "MyObject"
La razón por la que quiero hacerlo de esta manera es evitar el registro de cada clase implemento con un registrador con autofac en el código. Quiero poder registrar todos los objetos en xml, y simplemente tener un LoggerModule, que agrega este registro.
¡Gracias de antemano!
Estoy tratando de poner en práctica su módulo, pero no estoy encontrando la builder.Register() la función no genérico . – philt5252
Es un método de extensión que existe en la clase 'Autofac.RegistrationExtensions'. Definitivamente deberías tenerlo. –
jaja ... no importa ... No terminé de escribir el código, y olvidé que C# implicará el tipo de Func. – philt5252