【问题标题】:AutoMapper Unity AutoMapper.IConfigurationProvider IssueAutoMapper Unity AutoMapper.IConfigurationProvider 问题
【发布时间】:2017-07-11 23:07:19
【问题描述】:

我正在尝试将我的 AutoMapper(版本 5.2.0)Profile 类注册到我的 Unity 容器(Unity 版本 4.0.1)中,但它给了我一个例外:

解析依赖失败,type = IConsumer`1[Commands.INewUserEmailCommand]", name = "(none)"。 异常发生时:解决时。异常是:InvalidOperationException - 当前类型 AutoMapper.IConfigurationProvider 是一个接口,无法构造。您是否缺少类型映射?

这是配置文件类:

public class AutoMapperBootstrap : Profile
    {
        public AutoMapperBootstrap()
        {
            this.CreateMap<IUserEmailDTO, MergeUserEmailRequest>();
        }
    }

这里是 Unity 注册 sn-p:

Profile typeMaps = new AutoMapperBootstrap();
var config = new MapperConfiguration(cfg => cfg.AddProfile(typeMaps));
container.RegisterInstance<IMapper>(config.CreateMapper(), new ContainerControlledLifetimeManager());

然后我有依赖于被注入的 IMapper 实例的构造函数,显然 Unity 对此一无所知,或者它需要一些额外的 IConfigurationProvider 实例?我错过了什么?当我的代码需要调用依赖于 IMapper 的服务时,Unity 会抛出上述异常。下面是一个使用构造函数注入尝试获取 IMapper 实例的服务示例。

public class FooService : IFooService
{
  private readonly IMapper mapper;

  public Foo(IMapper mapper)
  {
    this.mapper = mapper;
  }
}

【问题讨论】:

  • 我应该跳过容器注册并使用具有所有映射的静态实例吗?我正在考虑让一个静态构造函数初始化我的配置文件,以便它始终可用...

标签: c# automapper unity-container


【解决方案1】:

@Andy,我认为您只是在映射中复制了部分错误,通常 automapper 会为您提供更多失败的详细信息,并可以为您提供线索。

在下面的行中,您正在尝试注册 IMapper 类的实例

container.RegisterInstance<IMapper>(config.CreateMapper(), new ContainerControlledLifetimeManager());

如果您查看 CreateMapper 的实际工作原理,您会发现它使用 IConfigurationProvider,请查看下面的 automapper 原始代码

public class MapperConfiguration : IConfigurationProvider
{
    .....

    public IMapper CreateMapper()
    {
       return (IMapper) new Mapper((IConfigurationProvider) this);
    }

    .....
}

当 automapper 尝试创建 Mapper 的实例时,也尝试解析参数 IConfigurationProvider。在这种情况下,您从未注入该参数。解决方案:注入该参数的一个实例,仅此而已

在这里,我将为您保存一个我如何使用它的示例

class Helper
{
    public static MapperConfiguration InitializeAutoMapper()
    {
        MapperConfiguration config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile(new ProfileA());
            cfg.AddProfile(new ProfileB());
        });

        return config;
    }
}

在您的 Unity 上注册,其中 containerIUnityContainer 的一个实例

var mapperConfig = Helper.InitializeAutoMapper();
var mapper = mapperConfig.CreateMapper();
container.RegisterType<IMapper, Mapper>(new InjectionConstructor(mapperConfig));
container.RegisterInstance(mapper, Activator.CreateInstance<T>());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多