注册代表或Func<Address, ValidationResult>
使用工厂方法来解析提供该方法的类型,然后返回该方法。
在您的示例中,您想要解决OrderValidator
并返回其ValidateAddress
method.
// 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 : Delegate
{
return serviceCollection.AddTransient(serviceProvider =>
getDelegateFromService(serviceProvider.GetRequiredService<TService>()));
}
}
在这种情况下,代表是使用注册的AddTransient
因为类的生命周期实际上是在类注册时确定的。
现在注册看起来像这样:
services.RegisterDelegateFromService<OrderValidator, ValidateAddressFunction>
(validator => validator.ValidateAddress);