Pergunta

Não consigo entender o parâmetro que passa no Autofac, o código a seguir não 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 joga:

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.

Mas o seguinte código faz trabalhar:

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));
Foi útil?

Solução

Repetindo aqui a resposta da lista de discussão do Autofac:

Os parâmetros foram aprovados para resolver apenas relacionados ao implementador direto do serviço que você está resolvendo; portanto, passar os parâmetros da configuração para a chamada de resolução para o consumidor não funcionará. A maneira como isso é alterar seu registro do consumidor para:

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

Outras dicas

O Autofac está obviamente tentando resolver o parâmetro da sua classe de configuração na suposição de que o próprio dicionário é um tipo resolvível. Não conheço a sintaxe do Autofac sobre como fazê -lo. Mas você provavelmente precisa fazer mais etapas ao registrar o tipo de configuração, por exemplo, dando a ele um delegado que passa em um novo dicionário.

Infelizmente, contêineres do COI como o Autofac não são equipados com um "Leia My Mind Module".

O que você está tentando fazer é basicamente dizer: "Eu sei que um dos tipos envolvidos aqui precisa de um dicionário e preciso de um serviço do tipo de consumidor, você pode tentar descobrir o que estou aceitando e apenas Faça o coisa certa?".

Se você resolver um serviço e especificar um parâmetro, esse parâmetro será tentado para ser usado para esse serviço específico. O contêiner não tentará propagar esse valor de parâmetro até quaisquer dependências.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top