AutoMapper 不适用于定义的规则

AutoMapper does not work with defined rules

我正在开发 REST api。我实现了自动映射器数据包以将 post 模型对象与正确的用户模型对象进行比较。

问题是我在dependency injection中配置和使用like service,却忽略了定义的规则

IMapper mapper = CreateMapperStartUp(services);

这里我创建了 IMapper 对象:

private IMapper CreateMapperStartUp(IServiceCollection services)
{
    var mapperConfiguration = new MapperConfiguration(conf =>
    {
        conf.AddProfile<MappingKey>();
    });

    IMapper mapper = mapperConfiguration.CreateMapper();
    services.AddAutoMapper(typeof(Startup));
    return mapper;
}

我正在使用配置文件 "MappingKey"。

public class MappingKey : Profile
{
        public MappingKey()
        {
            CreateMap<CreateKeyViewModel, Key>().ReverseMap();
            CreateMap<UpdateKeyViewModel, Key>().ReverseMap();
        }
}

在那里,我使用 post 对象模型和关键用户对象创建了 map 方法。最后是我的验证器 class 和映射规则。

public class CreateKeyValidator : AbstractValidator<CreateKeyViewModel>
{
    private readonly MysqlDAO _mysqlDAO;

    public CreateKeyValidator(MysqlDAO mysqlDAO)
    {
        _mysqlDAO = mysqlDAO;

        RuleFor(x => x.Id).NotNull().Must(x => !_mysqlDAO.ExistId(x));
        RuleFor(x => x.Colour).NotNull().Length(2, 3);
        RuleFor(x => x.Date).NotNull().Length(2, 50);
    }
}

问题是什么?为什么映射器传递带有空参数的对象?

如果我理解正确的话。您创建映射器。并且不要在任何地方使用它(不幸的是,您提供的代码中没有使用)。

你打电话给services.AddAutoMapper(typeof(Startup));

但是您创建的映射器 IMapper mapper 并初始化它的配置文件,此处未使用。那么,您的应用程序将如何了解映射器实例。

我说的对吗?如果不是,请提供更多上下文。

我想你应该这样写:

IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);

是的,在 post 中我没有写 AddSingleton,但在真正的管道中是这样的。

private IMapper CreateMapperStartUp(IServiceCollection services) {
    var mapperConfiguration = new MapperConfiguration(conf =>
    {
        // conf.CreateMap<Key, CreateKeyViewModel>();
        conf.AddProfile<MappingKey>();
    });

    IMapper mapper = mapperConfiguration.CreateMapper();
    services.AddAutoMapper(typeof(Startup));

    // services.AddSingleton(mapper);
    return mapper;
}

当我将实例添加到服务时,我需要访问已注册的 IMapper 实例。

private void AddMysqlService(IServiceCollection services)
{
    ILoggerFactory loggerFactory = CreateLoggerFactory(services.BuildServiceProvider());
    IMapper mapper = CreateMapperStartUp(services);

    services.AddSingleton<IConnection<Key>>(new ConnectionMannager(Configuration.GetSection("mysqlDb"), loggerFactory));

    var connectionMnamagerInstance = services.BuildServiceProvider().GetService<IConnection<Key>>();
    services.AddSingleton<IService<Key>>(new MysqlService(mapper, connectionMnamagerInstance));
}

好的,终于找到错误了。在这种情况下,验证 class 不是由 StartUp 上的服务定义的。所以使用fluentValidation方法创建自己的实例:

services.AddMvc().AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<Startup>());

就是这样。它适用于所有规则。