我有一个具有通用方法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同时使用UserProfileValidatorUserLoginValidator

为每个视图模型分配IValidator可能是一种更好的方法,这样每个视图模型都有自己的IValidator实现,然后您可以执行var errors = viewModel.Validate();之类的操作。

10-02 01:25