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
,