C# лямбда в 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)?

1 ответ

Решение

Это происходит потому, что параметр типа в методе For обозначает тип или класс, для которого вы хотите определить другой экземпляр, создающий делегат. В вашем коде это Func<ITest, ITestRunner>, который рассказывает StructureMap что когда я хочу объект типа Func<ITest, ITestRunner>, используйте все, что я указал в Use,

Я предполагаю, что вы хотите, чтобы карта использовала TestRunner всякий раз, когда ITest добавляется к нему. В этом случае параметр типа будет просто ITest, вот так:

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

Обратите внимание, что даже если два других блока кода скомпилированы, они не дадут вам требуемого результата. Вместо этого для каждого Func<ITest, ITestRunner>, StructureMap будет использовать значение, переданное Use,

Другие вопросы по тегам