Автоматическая передача параметров и автоматическая разводка
-
06-07-2019 - |
Вопрос
Не могу разобраться с передачей параметров в Autofac, следующий код не работает:
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));
}
}
который бросает:
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.
но следующий код работает :
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));
Решение
Повторим здесь ответ из списка рассылки Autofac:
Параметры, передаваемые в Resolve, относятся только к непосредственному исполнителю служба, которую вы решаете, поэтому передавая параметры Config на разрешение звонок для потребителя не сработает. Обойти это можно, изменив свою регистрацию потребителя на:
builder.Register((c, p) => new Consumer(c.Resolve<Config>(p)));
Другие советы
Autofac явно пытается разрешить параметр вашего класса Config в предположении, что сам Словарь является разрешаемым типом. Я не знаю синтаксис autofac о том, как это сделать. Но вам, вероятно, нужно сделать больше шагов при регистрации типа Config, e. г. давая ему делегата, который переходит в новый словарь.
К сожалению, контейнеры IoC, такие как Autofac, не оснащены " прочитайте, пожалуйста, мой разумный модуль ".
То, что вы пытаетесь сделать, это в основном сказать: «Я знаю, что для одного из типов, задействованных здесь, нужен словарь, и мне нужен сервис типа Consumer, не могли бы вы попытаться выяснить, что я взять и просто сделать правильную вещь ? ".
Если вы разрешите один сервис и укажете параметр, этот параметр будет пытаться использоваться для этого конкретного сервиса. Контейнер не будет пытаться распространить значение этого параметра на какие-либо зависимости.