Используя контейнер Lamar DI, как вы строите объекты с заданным типом lambda?

#c# #dependency-injection #lamar

#c# #внедрение зависимостей #ламар

Вопрос:

Lamar предоставляет следующий синтаксис для построения объектов с помощью лямбда-выражения:

 serviceRegistry.For<ISomeType>().Use(x => { ... });
  

Это позволит вам разрешить ISomeType, который выполнит зарегистрированный делегат:

  var someType = container.GetInstance<ISomeType>();
  

Существует ли не общий эквивалент, такой как следующий?

 serviceRegistry.For(typeof(ISomeType)).Use(x => { ... });
  

Я не вижу перегрузки для этого.

Комментарии:

1. Если вы посмотрите на исходный код, вы увидите, что желаемый синтаксис невозможен, поскольку Use член для этого For не допускает общий вызов github.com/JasperFx/lamar/blob/master/src/Lamar /…

2. Это может быть проблемой XY . Есть ли какая-то особая причина для того, чтобы использовать желаемый синтаксис?

3. Неплохо… никогда не слышал о проблеме XY. Я часто сталкивался с тем, каким было бы следствие (решение YX?) где вы спрашиваете, как сделать X, а кто-то рекомендует вместо этого сделать Y, предполагая, что у вас нет веской причины для X.

4. public object GetInstance(Type serviceType) исходный код (ISomeType)container.GetInstance(typeof(ISomeType))

Ответ №1:

Обнаружив, что Lamar ServiceRegistry является производным от ServiceProvider , я понял, что этого можно достичь с помощью API ServiceProvider:

 var container = new Container(x => x.Add(new ServiceDescriptor(typeof(string), sp => "test", ServiceLifetime.Singleton)));
Console.WriteLine(container.GetService<string>());
  

Смотрите Пример .Net Fiddle