使用自动映射程序中的配置文件映射具有不同逻辑的相同类型,并具有对自定义值解析程序的 DI 支持



我正在尝试在.net core 1.0.1应用程序中使用自动映射器来根据配置文件使用具有不同逻辑的映射类型。我也有一些自定义解析器。我无法在自定义解析程序中获得 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,以下行已添加到启动.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;
    }
}

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

使用 AutoMap per 中的扩展将其与 .NET Core 中的本机 IoC 集成时,无需自行应用映射器配置。

只需将程序集传递给函数

services.AddAutoMapper(myAssembliesContainingAutoMapperTypes);

如果类型与您的启动类位于同一项目中,请这样做

services.AddAutoMapper(typeof(Startup).Assembly);

现在,它将自动注册配置文件,值解析器等。它还具有将映射器配置传递给它的扩展方法。然后,这将被使用并扩展。

services.AddAutoMapper(config => { ... }, typeof(Startup).Assembly);

如果不传递包含解析程序和其他自动映射程序类型的程序集,还可以手动注册冲突解决程序。

services.AddTransiert(typeof(NameResolver));

第一种方法更好,推荐,你永远不会自己注册东西。这就是建立这个库的原因。只需将包含类型的程序集传递:)

最新更新