Automapper -> DTO to Entity - Как вызвать проверки Setter при отображении - PullRequest
0 голосов
/ 23 апреля 2020

Я создал сущность домена, и все заданные методы являются частными, поскольку они имеют некоторые проверки перед настройкой данных.

Итак, у меня есть Dtos для обмена данными, и затем я сопоставляю его с сущностью, чтобы я мог сохранить ее в базе данных, если все пойдет хорошо.

При сопоставлении Dto с сущностью я получаю сущность со всеми заполненными свойствами, но SetXXX не выполняются, как это было бы, если бы я вызвал конструктор напрямую.

Каков наилучший или правильный подход для тех случаев, когда используется AutoMapper?

Domain Entity

public Product(Guid id, ... decimal originalPrice, decimal discountedPrice...) :
            base(id)
        {
            OriginalPrice = CheckOriginalPrice(originalPrice, discountedPrice);
            DiscountedPrice = CheckDiscountedPrice(originalPrice, discountedPrice);
        }

        public virtual void SetOriginalPrice(decimal originalPrice, decimal discountedPrice)
        {
            OriginalPrice = CheckOriginalPrice(originalPrice, discountedPrice);
        }

private static decimal CheckOriginalPrice(decimal originalPrice, decimal discountedPrice)
        {
            if (originalPrice < 0)
                throw new ArgumentOutOfRangeException($"original price ({originalPrice} cannot be negative");
            else if (originalPrice < discountedPrice)
                throw new ArgumentOutOfRangeException($"original price ({originalPrice}) can not be lower than discounted price ({discountedPrice})!");

            return originalPrice;
        }

Карта будет успешной, если я сделаю это, поэтому проверка не происходит, как вызвать конструктор?

var product = _objectMapper.Map<CreateProductDto, Product>(product);

Если я тестирую класс сущности напрямую, он проходит тест как цена проверена, и я получаю исключение.

var exception = await Assert.ThrowsAsync<ArgumentOutOfRangeException>(async () =>
            {
                //Act
                var product =
                    new Product(
                        _guidGenerator.Create(),
                        ...
                        4.05m,
                        8.05m,
                        ...
                    );
            });
            //Assert
            exception.Message.ShouldContain("original price");

Итак, как мне добиться, чтобы при отображении с использованием ObjetMapper.Map конструктор выполнялся правильно, есть ли простой способ выполнить sh

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

AutoMapper имеет функцию, называемую условным отображением, которое, кажется, является тем, что вы ищете: https://docs.automapper.org/en/stable/Conditional-mapping.html

1 голос
/ 23 апреля 2020

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

...