我有一个具有通用方法Validate的接口IValidator,该接口旨在验证整个应用程序中的不同对象。现在,我正在验证用户的个人资料和登录凭据。问题是,当我尝试验证配置文件或Login类时,即使我尝试验证Login详细信息,它也始终调用该配置文件的方法。这是代码:
杀毒剂
public interface IValidator
{
List<Error> Validate<T>(T request);
}
UserProfileValidator
public class UserProfileValidator : IValidator
{
public List<Error> Validate<T>(T request)
{
//Code for profile validation
}
}
UserLoginValidator
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
。为每个视图模型分配
IValidator
可能是一种更好的方法,这样每个视图模型都有自己的IValidator
实现,然后您可以执行var errors = viewModel.Validate();
之类的操作。