【发布时间】:2020-09-14 09:14:44
【问题描述】:
我创建了一个通用类:
public class GenericCreate<T> : IRequest<Attempt<T>> where T: class
{
public T Model { get; }
public GenericCreate(T model) => Model = model;
}
public class GenericCreateHandler<T> : IRequestHandler<GenericCreate<T>, Attempt<T>> where T : class
{
private readonly NotNullValidator<T> _validator;
private readonly DatabaseContext _databaseContext;
public GenericCreateHandler(NotNullValidator<T> validator, DatabaseContext databaseContext)
{
_validator = validator;
_databaseContext = databaseContext;
}
public async Task<Attempt<T>> Handle(GenericCreate<T> request, CancellationToken cancellationToken)
{
var generic = request.Model;
var validationAttempt = _validator.Validate(generic).ToAttempt();
if (validationAttempt.Failure) return validationAttempt.Error;
_databaseContext.Add(generic);
await _databaseContext.SaveChangesAsync(cancellationToken);
return generic;
}
}
就类的功能而言,它是有效的。但是,我正在尝试根据T 的 type 注入不同的验证器。
你可以看到我正在尝试注入 NotNullValidator<T> 这本身就是一个类:
public class NotNullValidator<T> : AbstractValidator<T>
{
protected override bool PreValidate(ValidationContext<T> context, ValidationResult result)
{
if (context.InstanceToValidate != null) return true;
result.Errors.Add(new ValidationFailure("", "Please ensure a model was supplied."));
return false;
}
}
但我想注入的是这样的:
public class CategoryValidator: NotNullValidator<Category>
{
public CategoryValidator()
{
RuleFor(m => m.Id).NotEmpty();
RuleFor(m => m.Name).NotEmpty();
}
}
您可以想象,我为项目中的每个实体都有一个验证器类,因此能够获得正确的验证器很重要。 有谁知道我如何使用 .net core 做到这一点?
【问题讨论】:
-
我看到了三种方法:属性、配置或约定。对于第一个,定义一个属性,您将在描述需要注入的验证器的类上声明该属性。第二,您可以有一个配置类,将每个类映射到它的验证器(可能变得非常冗长)。或者第三,您需要建立一个约定,例如基于类的名称并使用反射来找到相应的验证器。
-
我不知道如何执行您提到的任何选项,但是对于您的第三个,我所有的验证器都命名为
<ObjectName>Validator -
除了第二个,option,第一个和第三个都是基于反射的。今天晚些时候,我将尝试在答案中写下一些示例。我可能会从第三个选项开始,因为您的验证器似乎很适合约定方法。
标签: c# generics dependency-injection