Автоматическая передача параметров и автоматическая разводка

StackOverflow https://stackoverflow.com/questions/1211595

Вопрос

Не могу разобраться с передачей параметров в 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, не могли бы вы попытаться выяснить, что я взять и просто сделать правильную вещь ? ".

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top