我为Automapper找到的大多数示例都使用静态Mapper对象来管理类型映射 . 对于我的项目,我需要使用StructureMap注入IMapperEngine作为对象构造的一部分,以便我们可以在单元测试中模拟映射器,因此我们不能使用静态映射器 . 我还需要支持配置AutoMapper配置文件 .
我的问题是如何配置StructureMap注册表,以便在构造MyService实例时它可以提供IMappingEngine的实例 .
这是Service构造函数签名:
public MyService(IMappingEngine mapper, IMyRepository myRepository, ILogger logger)
这是StructureMap注册表
public class MyRegistry : StructureMap.Configuration.DSL.Registry
{
public MyRegistry()
{
For<IMyRepository>().Use<MyRepository>();
For<ILogger>().Use<Logger>();
//what to do for IMappingEngine?
}
}
我要加载的配置文件
public class MyAutoMapperProfile : AutoMapper.Profile
{
protected override void Configure()
{
this.CreateMap<MyModel, MyDTO>();
}
}
4 回答
Mapper
类具有静态属性Mapper.Engine
. 使用此命令向容器注册引擎:如果您需要在注入引擎之前加载配置文件,我会在上面的代码段旁边插入配置代码 .
Update
您的自定义注册表将如下所示
此代码在您的引导程序中运行一次,之后所有类型为
IMappingEngine
的依赖项将使用您使用自定义AutoMapperProfile
配置的静态属性Mapper.Engine
的值提供 .在新版本(4.2.0> =)中,我们应该通过DI保持并传递 IMapper .
一个简单的配置服务应该是这样的(ASP.NET核心)
和我们的服务层(在构造函数注入的帮助下):
consider TDocument as Bar, and TModel as Foo
更新:
AutoMapper 4.2.1 released – Static is back
我写了一篇博文,其中显示了我的AutoMapper和StructureMap设置 . 我已经为AutoMapper 3.1.0(也适用于3.1.1)和3.0.0和2.2.1创建了特定的注册表 .
http://www.martijnburgers.net/post/2013/12/20/My-AutoMapper-setup-for-StructureMap.aspx
这是我最终得到的结果,因为我无法弄清楚如何在Mapper.Engine上设置配置并将其传递给For() . 使用 .