I'm trying to separate the concerns across my application and I thought this answer by Steven fits my scenario beautifully but I'm trying to remove the ninject element: Validation: How to inject A Model State wrapper with Ninject?
I've added all required classes from the answer.
I've got my service:
public class PromotionService {
private readonly IValidationProvider validationProvider;
public PromotionService(IValidationProvider validationProvider) {
this.validationProvider = validationProvider;
}
public void CreatePromotion(string promoName) {
//build the model
Promotion promo = new Promotion() {
//Name = promoName
};
//validate and throw validation exception
validationProvider.Validate(promo);
}
}
My ConfigureServices:
//Register Business Logic services
services.AddScoped<PromotionService>();
//get scope factory
var scopeFactory = services
.BuildServiceProvider()
.GetRequiredService<IServiceScopeFactory>();
//https://stackoverflow.com/questions/4776396/validation-how-to-inject-a-model-state-wrapper-with-ninject
Func<Type, IValidator> validatorFactory = type =>
{
var valType = typeof(Validator<>).MakeGenericType(type);
return (IValidator)scopeFactory.CreateScope().ServiceProvider.GetRequiredService(valType);
};
services.AddSingleton<IValidationProvider>(x => new ValidationProvider(validatorFactory));
services.AddScoped<Validator<Promotion>, PromotionValidator>();
Problem I get an exception when I call validationProvider.Validate(promo);
InvalidOperationException: No service for type 'VepoPortal.Services.Validators.Validator`1[VepoCustomerDatabase.Models.Promotion]' has been registered.
But I registered it here: services.AddScoped<Validator<Promotion>, PromotionValidator>();
Question How do I resolve this without the need for Ninject?
Edit: fixed with actual code:
services.AddScoped<Validator<Promotion>, PromotionValidator>();
services.AddScoped<IValidationProvider>(sp => {
Func<Type, IValidator> validatorFactory = type => {
var valType = typeof(Validator<>).MakeGenericType(type);
return (IValidator)sp.GetRequiredService(valType);
};
return new ValidationProvider(validatorFactory);
});