Autofac Parâmetro Passagem e Owowiringing
-
06-07-2019 - |
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));
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.