AutoMapper не работает с определенными правилами - PullRequest
0 голосов
/ 25 февраля 2020

Я разрабатываю REST API. Я реализую пакеты с помощью автоматического средства, чтобы сравнить объект модели поста с правильным объектом модели пользователя.

Проблема в том, что я настроил и использую как службу в внедрении зависимости, но игнорирую определенные правила.

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();
        }
}

Там я создал метод map с пост-объектными моделями и ключевыми объектами пользователя. И, наконец, мой класс валидатора с правилами отображения.

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);
    }
}

В чем проблема и почему преобразователь передает объект с нулевыми параметрами?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Да, в посте я не писал 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));
}
0 голосов
/ 26 февраля 2020

Хорошо, наконец-то нашел ошибку. В этом случае класс проверки не был определен службой при запуске. Итак, используя метод fluentValidation для создания своего собственного экземпляра:

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

И все. Работает нормально по всем нормам.

0 голосов
/ 25 февраля 2020

Если я правильно понимаю. Вы создаете картограф. И не используйте его нигде (к сожалению, вы не используете его в коде, который вы предоставляете).

Вы звоните services.AddAutoMapper(typeof(Startup));

Но созданный вами маппер IMapper mapper и инициирует его профиль, а не используется здесь. Итак, как ваше приложение будет знать об экземпляре mapper.

Я прав? Если нет, пожалуйста, предоставьте больше контекста.

Полагаю, вам следует написать что-то вроде этого:

IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...