我正在尝试在.net core 1.0.1应用程序中使用automapper来根据配置文件映射具有不同逻辑的类型。我也有一些自定义解析器。我无法在自定义解析器中获得DI支持。这是我创建映射器的代码。
private IMapper CreateMapper(string srcFormName)
{
switch (srcFormName)
{
case "app1":
{
var configuration1 = new MapperConfiguration(cfg =>
{
cfg.AddProfile<App1Profile>();
});
return configuration1.CreateMapper();
}
case "app2":
{
var configuration2 = new MapperConfiguration(cfg =>
{
cfg.AddProfile<App2Profile>();
});
return configuration2.CreateMapper();
}
default:
return null;
}
}
我正在使用包https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/2.0.1,并且以下行已添加到Startup.cs
services.AddAutoMapper();
我需要一个如下所示的自定义解析器
public class NameResolver : IValueResolver<MyType1, MyType2, string>
{
private IContextInfo _contextInfo;
//public NameResolver()
//{
//}
public NameResolver(IContextInfo contextInfo)
{
_contextInfo = contextInfo;
}
public string Resolve(ApplicationForm source, StpApplication destination,
string destMember, ResolutionContext context)
{
_contextInfo.RulesExecuted.Add(DateTime.Now.ToString());
return source.FirstName + " " + source.MiddleName + " " + source.LastName;
}
}
但是当我尝试映射时,我得到一个异常,就像无参数构造函数一样(在我的解析器上)并且无法映射。我相信这可能是因为创建了我自己的映射器配置,但是我不知道在不创建自己的配置的情况下使用多个配置文件。请帮我。
答案 0 :(得分:1)
使用AutoMapper中的扩展名将其与.NET Core中的本机IoC集成时,您不需要自己应用映射器配置。
只需将程序集传递给函数
即可services.AddAutoMapper(myAssembliesContainingAutoMapperTypes);
如果类型与Startup-Class位于同一项目中,请按照
进行操作services.AddAutoMapper(typeof(Startup).Assembly);
现在它将注册profiles, valueresolver and so on automatically。 它还有一个扩展方法,用于将映射器配置传递给它。然后将使用它并进行扩展。
services.AddAutoMapper(config => { ... }, typeof(Startup).Assembly);
如果您没有通过包含解析器和其他自动播放器类型的程序集,您也可以手动注册解析器。
services.AddTransiert(typeof(NameResolver));
第一种方法更好,值得推荐,你永远不会自己注册。这就是为什么建立这个图书馆的原因。只需传递包含您的类型的程序集:)