迁移到AutoMapper 4.2 / 5.0时,是否应该在依赖注入容器中存储IMapper实例或MapperConfiguration实例?

时间:2016-04-14 09:56:47

标签: c# unity-container automapper

我正在迁移到AutoMapper的newer configuration。我正在查看AutoMapper GitHub Wiki上的示例,并对如何完成配置感到有些困惑。 Wiki在一个地方说你可以在你的D.I中存储MapperConfiguration实例。容器(或静态存储),但下一段说明您可以静态存储Mapper实例。简而言之,我不确定我是否应该这样做

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<Foo, Bar>().ReverseMap(); //creates a bi-directional mapping between Foo & Bar
    cfg.AddProfile<FooProfile>(); //suppose FooProfile creates mappings...
});

然后使用D.I.像Unity这样的容器来存储那个实例......

container.RegisterInstance<MapperConfiguration>(config);

我稍后可以使用此实例执行映射...

public void CreateMapping(MapperConfiguration config, Bar bar)
{
     Foo foo = config.CreateMapper().Map(bar);
     //do stuff with foo
}

或者,我应该存储MapperConfiguration创建的IMapper实例

container.RegisterInstance<IMapper>(config.CreateMapper());

其用法如下

public void CreateMapping(IMapper mapper, Bar bar)
{
     Foo foo = mapper.Map(bar);
     //do stuff with foo
}

在初始配置调用Map方法后,我将在我的应用程序中执行所有操作。我不需要修改配置。我应该将IMapper实例或MapperConfiguration实例存储在我的依赖注入容器中吗?

更新:我最终向我的D.I.注册了IMapper。容器。就我而言,Unity。

1 个答案:

答案 0 :(得分:2)

我不明白为什么你不能同时存储两者。我有需要注入一个或另一个或两者的情况,因为我使用<%= f.input :author, :as => :grouped_select, :collection => [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]], :group_method => :last %> <%= f.input :author, :as => :grouped_select, :collection => Proc.new { [['Authors', ['Jose', 'Carlos']], ['General', ['Bob', 'John']]] }, :group_method => :last %> <%= f.input :author, :as => :grouped_select, :collection => { ['Jose', 'Carlos'] => 'Authors' }, :group_method => :first, :group_label_method => :last %> <%= f.input :author, :as => :grouped_select, :collection => { 'Authors' => ['Jose', 'Carlos'] }, :group_method => :last, :label_method => :upcase, :value_method => :downcase %> 进行LINQ投影,MapperConfiguration进行映射本身。我的IoC注册如下:

IMapper

}

由于public static Container RegisterAutoMapper(this Container container) { var profiles = typeof(AutoMapperRegistry).Assembly.GetTypes().Where(t => typeof(Profile).IsAssignableFrom(t)).Select(t => (Profile)Activator.CreateInstance(t)); var config = new MapperConfiguration(cfg => { foreach (var profile in profiles) { cfg.AddProfile(profile); } }); container.RegisterSingleton<MapperConfiguration>(() => config); container.RegisterSingleton<IMapper>(() => container.GetInstance<MapperConfiguration>().CreateMapper()); return container; } 可以创建IMapper对象,因此我的IoC会从当前注册的MapperConfiguration中生成IMapper个实例。