我有一个接口(interface) IValidator,它有一个通用方法 Validate,旨在验证应用程序中的不同对象。现在我正在验证用户的个人资料和登录凭据。问题是,当我尝试验证配置文件或登录类时,它总是调用配置文件的方法,即使我尝试验证登录详细信息也是如此。代码如下:
I验证器
public interface IValidator
{
List<Error> Validate<T>(T request);
}
用户配置文件验证器
public class UserProfileValidator : IValidator
{
public List<Error> Validate<T>(T request)
{
//Code for profile validation
}
}
用户登录验证器
public class UserLoginValidator: IValidator
{
public List<Error> Validate<T>(T request)
{
//Code for login validation
}
}
用户服务
private readonly IValidator _validator;
public UserService(IValidator validator)
{
_validator = validator;
}
public async Task<Response> Login(UserDetail userDetail)
{
//this is supposed to validate login details, but validates profile instead
var errors = _validator.Validate(userDetail);
}
public async Task<Response> UpdateProfile(Profile profile)
{
var errors = _validator.Validate(profile);
}
请指导。谢谢
最佳答案
我发布了这篇文章,尽管它可能无法解决OP的问题。
根据您的说法,您正在使用 AutoFac。
服务:
builder.RegisterType<UserService>().As<IUserService>();
验证者:
builder.RegisterAssemblyTypes(typeof(DependencyBuilder).Assembly).Where(t => t.Name.EndsWith("Validator")).AsImplementedInterfaces().InstancePerLifetimeScope();
看看您如何注册您的UserService
,您没有向其构造函数提供特定的IValidator
参数,我认为这就是AutoFac继续使用UserProfileValidator的原因
。从逻辑上讲,UserService
如何知道在运行时使用 IValidator
的哪种实现?
我经常使用以下内容来指定构造函数的参数。
builder
.Register(r => new UserService(r.Resolve<IValidator>()))
.As<IUserService>()
.InstancePerRequest();
但问题是 DI 是否会解析 IValidator
它仍然不具体。
我建议重新设计您的代码,因为我认为您当前的设计不允许 UserService
同时使用 UserProfileValidator
和 UserLoginValidator
。
可能为每个 View 模型分配 IValidator
是一个更好的方法,这样每个 View 模型都有自己的 IValidator
实现,那么你可以执行类似 var 的操作错误 = viewModel.Validate();
.
关于c# - 如何使用相同的通用方法来验证不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51870611/