jfc*_*c37 5 c# generics factory-pattern fluentvalidation
我有一个名为Validator的抽象类:
public abstract class Validator<T> where T : IValidatable
{
public abstract bool Validate(T input);
}
Run Code Online (Sandbox Code Playgroud)
我有一些具体的实现.一个是AccountValidator:
public class AccountCreateValidator : Validator<IAccount>
{
public override bool Validate(IAccount input)
{
//some validation
}
}
Run Code Online (Sandbox Code Playgroud)
另一个是LoginValidator:
public class LoginValidator : Validator<IAccount>
{
public override bool Validate(IAccount input)
{
//some different validation
}
}
Run Code Online (Sandbox Code Playgroud)
我现在想要创建一个工厂来返回验证器实现的实例.就像是:
public static class ValidatorFactory
{
public static Validator GetValidator(ValidationType validationType)
{
switch (validationType)
{
case ValidationType.AccountCreate:
return new AccountCreateValidator();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我喜欢这样称呼它
Validator myValidator = ValidatorFactory.GetValidator(ValidationType.AccountCreate);
Run Code Online (Sandbox Code Playgroud)
但是它不喜欢返回新的AccountCreateValidator()行,或者我将myValidator声明为Validator而不是Validator<SomeType>.任何帮助,将不胜感激.
看来您正在使用工厂将枚举参数转换为具体的验证实现。但我想,虽然调用者不知道或不关心验证器的具体类型,但它可能确实知道它希望验证的类型。这应该意味着将 GetValidator 方法设置为通用方法是合理的:
public static Validator<TypeToValidate> GetValidator<TypeToValidate>(ValidationType validationType) where TypeToValidate : IValidatable
Run Code Online (Sandbox Code Playgroud)
然后调用代码将如下所示
Validator<IAccount> validator = ValidatorFactory.GetValidator<IAccount>(ValidationType.AccountCreate:)