AutoMapper ConstructServicesUsing被忽略

时间:2014-06-07 22:57:37

标签: automapper

我有一个Person和一个PersonViewModel。我从Person =>创建了一张地图PersonViewModel。问题是 PersonViewModel唯一的构造函数需要一个参数(它有一个我想要注入的依赖项)和AutoMapper抱怨,因为它说它需要一个无参数的构造函数。

要修复它,我使用了ConstructServicesUsing方法,但我没有成功:(

为了说明这个案例,我为你创建了一个测试,看看我在做什么。这很简单:

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

代码的其余部分是类和接口定义。他们几乎是空的。

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
{
}

如您所见,我为AutoMapper提供了FactoryMethod,但它永远不会被调用。

当它到达测试的最后一行(Mapper.Map&lt; ...&gt;())时,它会抛出一个说明:

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?

2 个答案:

答案 0 :(得分:0)

我正在使用.NET Core 3.1和Automapper.Extensions.Microsoft.DependencyInjection。

这对我不起作用(与您的错误相同):

public class AutoMapping : Profile
{
    public AutoMapping()
    {
         CreateMap<Context, MainViewModel>()
             .ReverseMap()
             .ConstructUsingServiceLocator();
    }
}

但这确实有效:

public class AutoMapping : Profile
{
    public AutoMapping()
    {
         CreateMap<Context, MainViewModel>()
             .ConstructUsingServiceLocator()
             .ReverseMap();
    }
}

我仍然不完全了解原因。

答案 1 :(得分:-1)

正如@khorvat提到缺少.ConstructUsingServiceLocator()的地方,具体的映射。

您也可以通过

直接设置构造函数
.ConstructUsing(source => Method(source.anySourceOptions))

或者例外说:

  

PersonViewModel必须具有0个args的构造函数或者只能是可选的   ARGS。您只有一个构造函数,其中1不是可选参数

你可以创建一个没有args的构造函数:

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