c# - 如何使用相同的通用方法来验证不同类型

标签 c# asp.net asp.net-mvc asp.net-web-api

我有一个接口(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 同时使用 UserProfileValidatorUserLoginValidator

可能为每个 View 模型分配 IValidator 是一个更好的方法,这样每个 View 模型都有自己的 IValidator 实现,那么你可以执行类似 var 的操作错误 = viewModel.Validate();.

关于c# - 如何使用相同的通用方法来验证不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51870611/

相关文章:

asp.net-mvc - 什么是 Machine.config、Web.config、App.config

c# - 如何在C#中修改字典中的键

C# 数据表问题

c# - SQL0666 - SQL 查询超出指定的时间限制或存储限制

c# - C# 中 ComVisible 类中的接口(interface)继承

javascript - css动画完成后运行js脚本

asp.net-mvc - 有没有办法跨 RedirectToAction 维护 IsAjaxRequest()?

c# - Web API 2 路由属性不起作用

asp.net - IdentityServer4 Google 签名回调不包含 "IdentityConstants.ExternalScheme"cookie

asp.net-mvc - Onion架构同层依赖: Infrastructure and Web communicating