在Automapper中使用配置文件使用不同的逻辑映射相同的类型,并为CustomValue Resolvers提供DI支持

时间:2018-03-09 10:20:37

标签: asp.net-core dependency-injection automapper

我正在尝试在.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;
    }
}

但是当我尝试映射时,我得到一个异常,就像无参数构造函数一样(在我的解析器上)并且无法映射。我相信这可能是因为创建了我自己的映射器配置,但是我不知道在不创建自己的配置的情况下使用多个配置文件。请帮我。

1 个答案:

答案 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));

第一种方法更好,值得推荐,你永远不会自己注册。这就是为什么建立这个图书馆的原因。只需传递包含您的类型的程序集:)