我正在迁移到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。
答案 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
个实例。