C# 自动参数注入

C# 自动参数注入,c#,dependency-injection,inversion-of-control,autofac,C#,Dependency Injection,Inversion Of Control,Autofac,我误解了将参数传递给解析方法的过程。以下是我的意思的一个简单示例: 例子 publicstaticvoidmain() { var cb=新的ContainerBuilder(); cb.RegisterType传递给B类 不幸的是,异常消息“Sequence contains no elements”表明没有传递任何参数 问题: 如何将参数(仅在解析时已知)传递给较低级别的构造函数?或者在这个特定示例中,在解析a选项1时,如何将C参数传递给B 我能想到的最简单的方法是将解决过程分为两个步骤:

我误解了将参数传递给解析方法的过程。以下是我的意思的一个简单示例:

例子

publicstaticvoidmain()
{
var cb=新的ContainerBuilder();
cb.RegisterType传递给B类

不幸的是,异常消息“Sequence contains no elements”表明没有传递任何参数

问题: 如何将参数(仅在解析时已知)传递给较低级别的构造函数?或者在这个特定示例中,在解析a

选项1时,如何将C参数传递给B 我能想到的最简单的方法是将解决过程分为两个步骤:

首先,您可以在运行时通过指定的已知
C
值解析
B
,将其存储在
myB
参考值中:

B myB = c.Resolve<B>(TypedParameter.From(new C()));
您可以在my(带输出)中找到完整的工作示例

选择2 如果您希望在解析时间写入一行代码,则需要使用以下内容修改
a
B
的寄存器:

cb.Register<A>((c, p) =>
{
    B myB = c.Resolve<B>(p);
    return new A(myB);
});
cb.Register<B>((c, p) => {
    C myC = p.Named<C>("myC");
    return new B(myC);
});

cb.Register(带输出)。

确保您的问题是独立的。请将所有相关代码段和异常详细信息作为问题的一部分。@TravisIllig。“弄清楚如何在运行时确定参数,并将其包装在提供程序或lamda表达式注册中”-->您能告诉我,对于每次运行时由不同json提供的对象,您将如何实现它吗?我不明白您在问什么——“不同的json”来自何处?来自何处这是很重要的。这是你需要在问题中包含的信息,以获得充分的答案。这些都是非常有用的技术,可以帮助我更好地理解Autofac。但是它们违背了国际奥委会的理念,不是吗?@ThierryProst,你能解释为什么吗?我绝对不是这方面的专家,所以我将使用Autofac doc whi的话Chillg指出:“通过假设您“知道”整个依赖链是如何解决的,将C作为参数传递给a打破了基于接口的开发和控制反转所带来的解耦。”虽然你的方法在技术上非常正确,实际上相当巧妙,但我想我必须以完全不同的方式思考这个问题……没错,这是一个设计问题,我会更新我的答案
A myA = c.Resolve<A>(TypedParameter.From(myB));
cb.Register<A>((c, p) =>
{
    B myB = c.Resolve<B>(p);
    return new A(myB);
});
cb.Register<B>((c, p) => {
    C myC = p.Named<C>("myC");
    return new B(myC);
});
A myA = c.Resolve<A>(new NamedParameter("myC", new C()));