Автоматическая передача параметров и автоматическая разводка - PullRequest
6 голосов
/ 31 июля 2009

Не могу разобраться с передачей параметров в 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));

Ответы [ 3 ]

19 голосов
/ 02 августа 2009

Повторяйте здесь ответ из списка рассылки Autofac:

Параметры, передаваемые в Resolve, относятся только к непосредственному исполнителю служба, которую вы решаете, поэтому передавая параметры Config на разрешение звонок для потребителя не сработает. Обходной путь - изменить регистрацию потребителя на:

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 
0 голосов
/ 02 августа 2009

К сожалению, контейнеры IoC, такие как Autofac, не оснащены модулем «Пожалуйста, прочтите мой разум».

То, что вы пытаетесь сделать, это в основном сказать: «Я знаю, что для одного из типов здесь нужен словарь, и мне нужен сервис типа Consumer, не могли бы вы попытаться выяснить, что я беру о и просто делать правильную вещь ? ".

Если вы разрешите один сервис и укажете параметр, этот параметр будет пытаться использоваться для этого конкретного сервиса. Контейнер не будет пытаться распространить значение этого параметра на какие-либо зависимости.

0 голосов
/ 31 июля 2009

Autofac явно пытается разрешить параметр вашего класса Config в предположении, что сам Словарь является разрешаемым типом. Я не знаю синтаксис autofac о том, как это сделать. Но вам, вероятно, нужно сделать больше шагов при регистрации типа Config, e. г. давая ему делегата, который переходит в новый словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...