8

我正在将我的 AutoMappers 从使用一个大型 AutoMapperConfiguration 类转换为使用实际配置文件。全局现在看起来像这样(暂时原谅 Open/Close 违规)

Mapper.Initialize(x =>
                       {
                          x.AddProfile<ABCMappingProfile>();
                          x.AddProfile<XYZMappingProfile>();
                          // etc., etc.
                  });

让我脱颖而出的关键部分和以前一直阻止我使用配置文件的障碍是我的 ninject 绑定。我永远无法让绑定工作。之前我有这个绑定:

Bind<IMappingEngine>().ToConstant(Mapper.Engine).InSingletonScope();

我已经迁移到这个绑定:

Bind<IMappingEngine>().ToMethod(context => Mapper.Engine);

现在可以了,该应用程序正常运行,我有个人资料,一切都很好。

障碍现在在我的单元测试中。使用 NUnit,我将设置我的构造函数依赖项。

private readonly IMappingEngine _mappingEngine = Mapper.Engine;

然后在我的 [Setup] 方法中,我将构建我的 MVC 控制器并调用 AutoMapperConfiguration 类。

[SetUp]
public void Setup()
{
    _apiController = new ApiController(_mappingEngine);
    AutoMapperConfiguration.Configure();
}

我现在已经修改为。

[SetUp]
public void Setup()
{
    _apiController = new ApiController(_mappingEngine);

    Mapper.Initialize(x =>
                          {
                              x.AddProfile<ABCMappingProfile>();
                              x.AddProfile<XYZMappingProfile>();
                              // etc., etc.
                          });
}

不幸的是,这似乎不起作用。当我点击使用映射的方法时,映射似乎没有被拾取,AutoMapper 抛出异常,说明映射不存在。关于如何/如何更改测试中的映射器定义/注入以解决此问题的任何建议?我猜 IMappingEngine 字段的定义是我的问题,但不确定我有什么选择。

谢谢

4

1 回答 1

3

您遇到的问题是使用静态的结果,静态Mapper.Engine是某种包含 AutoMapper 配置的单例。按照惯例,Mapper.Engine配置后不应更改。所以,如果你想通过提供AutoMapper.Profiler每个单元测试来配置 Automapper,你应该避免使用它。

更改非常简单:将AutoMapperConfiguration它自己的实例添加到您的类的实例AutoMapper.MappingEngine中,而不是使用全局 static Mapper.Engine

public class AutoMapperConfiguration 
{
    private volatile bool _isMappinginitialized;
    // now AutoMapperConfiguration  contains its own engine instance
    private MappingEngine _mappingEngine;

    private void Configure()
    {
        var configStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers());

        configStore.AddProfile(new ABCMappingProfile());
        configStore.AddProfile(new XYZMappingProfile());

        _mappingEngine = new MappingEngine(configStore);

        _isMappinginitialized = true;
    }

    /* other methods */
}

ps:完整样本在这里

于 2013-04-24T04:04:29.200 回答