【发布时间】:2019-09-06 10:36:41
【问题描述】:
我试图在我的应用程序中分离关注点,我认为 Steven 的这个答案非常适合我的场景,但我试图删除 ninject 元素: Validation: How to inject A Model State wrapper with Ninject?
我已经从答案中添加了所有必需的类。
我有我的服务:
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);
}
}
我的配置服务:
//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>();
问题调用validationProvider.Validate(promo);时出现异常
InvalidOperationException: No service for type 'VepoPortal.Services.Validators.Validator`1[VepoCustomerDatabase.Models.Promotion]' has been registered.
但是我在这里注册了:services.AddScoped<Validator<Promotion>, PromotionValidator>();
问题如何在不需要 Ninject 的情况下解决此问题?
编辑:用实际代码修复:
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);
});
【问题讨论】:
标签: generics asp.net-core dependency-injection