我有一个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?
答案 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();
}