Pregunta

No puedo entender el parámetro que pasa en Autofac, el siguiente código no funciona:

class Config {
    public Config(IDictionary<string, string> conf) {}
}

class Consumer {
    public Consumer(Config config) {}
}

void Main()
{
    var builder = new Autofac.Builder.ContainerBuilder();
    builder.Register<Config>();
    builder.Register<Consumer>();
    using(var container = builder.Build()){
        IDictionary<string,string> parameters = new Dictionary<string,string>();
        var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(parameters));
    }
}

que arroja:

DependencyResolutionException: The component 'UserQuery+Config' has no resolvable constructors. Unsuitable constructors included:
Void .ctor(System.Collections.Generic.IDictionary`2[System.String,System.String]): parameter 'conf' of type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' is not resolvable.

pero el siguiente código funciona :

IDictionary<string,string> parameters = new Dictionary<string,string>();
var config = container.Resolve<Config>(Autofac.TypedParameter.From(parameters));
var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(config));
¿Fue útil?

Solución

Repitiendo aquí la respuesta de la lista de correo de Autofac:

Los parámetros pasados ??a Resolver solo están relacionados con el implementador directo de el servicio que está resolviendo, por lo que pasar los parámetros de Config a la resolución llamar al consumidor no funcionará. La solución a esto es cambiar su registro de Consumidor a:

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 

Otros consejos

Autofac obviamente está tratando de resolver el parámetro de su clase Config en el supuesto de que el Diccionario en sí es un tipo resoluble. No sé la sintaxis de autofac sobre cómo hacerlo. Pero probablemente deba seguir más pasos al registrar el tipo de configuración, e. sol. dándole un delegado que pasa en un nuevo diccionario.

Desafortunadamente, los contenedores IoC como Autofac no vienen equipados con un " lea mi módulo mental " ;.

Lo que estás tratando de hacer es básicamente decir "Sé que uno de los tipos involucrados aquí necesita un diccionario, y necesito un servicio de tipo Consumidor, ¿puedes intentar averiguar qué es lo que soy? tomando y simplemente haciendo lo correcto ? " ;.

Si resuelve un servicio y especifica un parámetro, se intentará utilizar ese parámetro para ese servicio en particular. El contenedor no intentará propagar ese valor de parámetro a ninguna dependencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top