StructureMap 中的 C# lambda

C# lambda in StructureMap

使用 StructureMap 4,我是 C# 的新手,我想知道为什么会出现编译错误:

var di = new Container(_ =>
{
    // (1) compile error: CS1503: Argument 1: cannot convert from 'StructureMap.IContext' to '...ITest'
    _.For<Func<ITest, ITestRunner>>().Use( arg => new TestRunner(arg) );

    // (2) compiles OK
    Func<ITest, ITestRunner> f1 = arg => new TestRunner(arg);
    _.For<Func<ITest, ITestRunner>>().Use( f1 );

    // (3) with cast compiles ok
    _.For<Func<ITest, ITestRunner>>().Use( (Func<ITest, ITestRunner>)( arg => new TestRunner(arg)));
});

是否有紧凑的语法,我不需要 f1 变量 (2) 并且不需要强制转换重复类型 (3)?

发生这种情况是因为方法 For 中的类型参数表示您要为其定义不同实例创建委托的类型或 class。在你的代码中它是 Func<ITest, ITestRunner>,它告诉 StructureMap 当我想要一个 Func<ITest, ITestRunner> 类型的对象时,使用我在 Use 中指定的任何内容。

我的猜测是您希望地图在添加 ITest 时使用 TestRunner。在这种情况下,类型参数将只是 ITest,如下所示:

_.For<ITest>().Use(arg => new TestRunner(arg));

请注意,即使其他两个代码块确实 编译了,它们也不会为您提供所需的结果。相反,对于每个 Func<ITest, ITestRunner>StructureMap 将使用传递给 Use.

的值