AutoMapper ConstructServicesUsing ignored

I have Person and PersonViewModel. I created a map from Person => PersonViewModel. The problem is that the PersonViewModel constructor needs an argument (it has a dependency that I want to insert), and AutoMapper complains because it says it needs a constructor without parameters.

To fix this, I used the ConstructServicesUsing method, but I failed: (

To illustrate this case, I created a test for you to see what I am doing. It is pretty simple:

    [TestMethod]
    public void TestConstructServicesUsing()
    {
        Mapper.Initialize(configuration =>
        {
            configuration.ConstructServicesUsing(FactoryMethod);
            configuration.CreateMap<Person, PersonViewModel>();
        });

        Mapper.AssertConfigurationIsValid();

        var person = new Person();
        var personViewModel = Mapper.Map<Person, PersonViewModel>(person);
    }

    private object FactoryMethod(Type type)
    {
        throw new NotImplementedException();
    }
}

The rest of the code is the definitions of classes and interfaces. They are almost empty.

public class SomeyDependency : ISomeDependency
{
}

public class PersonViewModel
{
    private readonly ISomeDependency service;

    public PersonViewModel(ISomeDependency service)
    {
        this.service = service;
    }

    public string Name { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

public interface ISomeDependency
{
}

As you can see, I provide AutoMapper with FactoryMethod, but it is never called.

(Mapper.Map <... > ()), :

AutoMapper.AutoMapperMappingException: 

Mapping types:
Person -> PersonViewModel
MappingWithContainerTests.Person -> MappingWithContainerTests.PersonViewModel

Destination path:
PersonViewModel

Source value:
MappingWithContainerTests.Person ---> System.ArgumentException: Type needs to have a constructor with 0 args or only optional args
Parameter name: type

? FactoryMethod?

+4
1

@khorvat , .ConstructUsingServiceLocator(), .

.ConstructUsing(source => Method(source.anySourceOptions))

:

PersonViewModel, 0 . 1

args:

public PersonViewModel()
{
    this.service = new SomeDependency();
}
-1

Source: https://habr.com/ru/post/1543706/


All Articles