我使用Asp.net核心與AutoFac這裏之後接受的答案:Asp.net核心AutoFac註冊使用通用工廠
Validation: How to inject A Model State wrapper with Ninject?
這使用ninject。我不明白怎麼做autoFac這ninject部分的等效,特別是kernel.Get
:
Func<Type, IValidator> validatorFactory = type =>
{
var valType = typeof(Validator<>).MakeGenericType(type);
return (IValidator)kernel.Get(valType);
};
kernel.Bind<IValidationProvider>()
.ToConstant(new ValidationProvider(validatorFactory));
Startup.cs
public IServiceProvider ConfigureServices(IServiceCollection services)
{
var containerBuilder = new ContainerBuilder();
IValidator ValidatorFactory(Type type)
{
var valType = typeof(Validator<>).MakeGenericType(type);
//This line is the problem
// return (IValidator)container.Resolve(valType);
}
containerBuilder.Register(x => new ValidationProvider(ValidatorFactory)).As<IValidationProvider>().SingleInstance();
containerBuilder.RegisterType<UploadValidator>().As<Validator<AudioModel>>();
containerBuilder.Populate(services);
var container = containerBuilder.Build();
return container.Resolve<IServiceProvider>();
}
的問題是,容器只能使用.Build()
後所以我不明白我該怎麼做。我需要在撥打.Build()
後再註冊此服務,然後再撥打.Build()
或在.Resolve()
這裏使用錯誤的東西。
驗證類:
internal sealed class ValidationProvider : IValidationProvider
{
private readonly Func<Type, IValidator> _validatorFactory;
public ValidationProvider(Func<Type, IValidator> validatorFactory)
{
_validatorFactory = validatorFactory;
}
public void Validate(object entity)
{
var results = _validatorFactory(entity.GetType()).Validate(entity).ToArray();
if (results.Length > 0)
throw new ValidationException(results);
}
public void ValidateAll(IEnumerable entities)
{
var results = (
from entity in entities.Cast<object>()
let validator = _validatorFactory(entity.GetType())
from result in validator.Validate(entity)
select result).ToArray();
if (results.Length > 0)
throw new ValidationException(results);
}
}
public abstract class Validator<T> : IValidator
{
IEnumerable<ValidationResult> IValidator.Validate(object entity)
{
if (entity == null)
throw new ArgumentNullException(nameof(entity));
return Validate((T)entity);
}
protected abstract IEnumerable<ValidationResult> Validate(T entity);
}
public class UploadValidator : Validator<AudioModel>
{
protected override IEnumerable<ValidationResult> Validate(AudioModel model)
{
if (string.IsNullOrWhiteSpace(model.Name))
{
yield return new ValidationResult("Name", "Name is required");
}
}
}
我遠離我的電腦,所以無法編譯您的代碼 - 具體問題是什麼?你看到一行錯誤'return(IValidator)container.Resolve(valType)'?或者這個調用不返回任何東西? –
@ChimaOsuji問題是容器只有在使用'.Build()'後纔可用,所以我沒有看到我能做到這一點。我需要在調用'.Build()'之後註冊這個服務,然後再次調用'.Build()'或者'.Resolve()'這裏使用的錯誤。 –