代码之家  ›  专栏  ›  技术社区  ›  Carl Hörberg

自动交流参数传递和自动接线

  •  5
  • Carl Hörberg  · 技术社区  · 15 年前

    在autopac中无法获得参数传递的信息,以下代码不起作用:

    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 回复  |  直到 13 年前
        1
  •  18
  •   Aliostad    13 年前

    在这里重复自动空调邮件列表中的答案:

    传递给解析的参数仅与的直接实现者相关 正在解析的服务,因此将config的参数传递给resolve 呼叫消费者不起作用。 解决方法是将您的消费者注册更改为:

    builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 
    
        2
  •  0
  •   galaktor    15 年前

    显然,autofac是在假设字典本身是可解析类型的情况下,尝试解析config类的参数。我不知道如何使用autopac语法。但是在注册配置类型时,您可能需要执行更多的步骤,例如,为它提供一个传递到新字典中的委托。

        3
  •  0
  •   Lasse V. Karlsen    15 年前

    不幸的是,像autopac这样的IOC容器没有配备“请阅读我的思维模块”。

    你要做的基本上是说,“我知道这里涉及到的一种类型需要字典,我需要一个类型消费者的服务,你能试着找出我要做的是什么,然后做 正确的事情 “.

    如果解析一个服务并指定一个参数,则该参数将尝试用于该特定服务。容器不会尝试将该参数值向下传播到任何依赖项。