Зарегистрируйте делегата или Func<Address, ValidationResult>
, используя фабричный метод, который разрешает тип, который предоставляет метод, а затем возвращает метод.
В вашем примере вы захотите разрешить OrderValidator
и вернуть его ValidateAddress
метод.
// register the class that provides the method and its dependencies.
services.AddSingleton<OrderValidator>();
services.AddSingleton<ISomeDependency, SomeDependency>();
// register the delegate using a factory method that resolves
// the type that provides the method and then returns the method.
services.AddSingleton<ValidateAddressFunction>(serviceProvider =>
{
var validator = serviceProvider.GetRequiredService<OrderValidator>();
return validator.ValidateAddress;
});
Это будет работать точно так же, если вы зарегистрируете Func<Address, ValidationResult>
вместо делегата:
services.AddSingleton<Func<Address,ValidationResult>>(serviceProvider =>
{
var validator = serviceProvider.GetRequiredService<OrderValidator>();
return validator.ValidateAddress;
});
Вы можете упростить регистрацию, используя расширение. Это не намного короче, но все равно помогает, если у вас есть несколько таких регистраций. Это также может помочь выразить ваше намерение, поэтому совершенно ясно, что вы регистрируете делегата для внедрения, а не реализации класса или реализации интерфейса:
public static class ServiceCollectionDelegateExtensions
{
public static IServiceCollection RegisterDelegateFromService<TService, TDelegate>(
this IServiceCollection serviceCollection,
Func<TService, TDelegate> getDelegateFromService)
where TDelegate : class
{
return serviceCollection.AddTransient(serviceProvider =>
getDelegateFromService(serviceProvider.GetRequiredService<TService>()));
}
}
В этом случае делегат регистрируется с использованием AddTransient
, поскольку время жизни класса действительно определяется при регистрации класса.
Теперь регистрация будет выглядеть так:
services.RegisterDelegateFromService<OrderValidator, ValidateAddressFunction>
(validator => validator.ValidateAddress);