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>());
就是这样。它适用于所有规则。
我正在开发 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>());
就是这样。它适用于所有规则。