#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>());